码迷,mamicode.com
首页 > 移动开发 > 详细

Android文件操作的存放位置和形式

时间:2015-08-06 18:17:09      阅读:553      评论:0      收藏:0      [点我收藏+]

标签:

        在上课学习时也学了,虽然大概知道如何用,项目中都在用,但总感觉“不系统”,因此看看大牛的博客,根据自己理解与之前所学,在总结一下,心里有个底。

第一,存储位置:内部存储 ,外部存储   和 apk内部资源

              内部存储(internal storage :由android系统分配给app的空间)

              外部存储(external storage:开发中通常指sd卡)

              apk内部资源(这是我自己的归类,指的是开发时工程目录下的文件,主要为Assets目录,这样归类只是便于记忆)

          

以下解释来自:http://blog.csdn.net/androidwifi/article/details/17725989

      1.内部存储: 内部存储不是内存。内部存储位于系统中很特殊的一个位置,如果你想将文件存储于内部存储中,那么文件默认只能被你的应用访问到,且一个应用所创建
的所有文件都在和应用包名相同的目录下。也就是说应用创建于内部存储的文件,与这个应用是关联起来的。当一个应用卸载之后,内部存储中的这些文件也被删除。从技术上来
讲如果你在创建内部存储文件的时候将文件属性设置成可读,其他app能够访问自己应用的数据,前提是他知道你这个应用的包名,如果一个文件的属性是私有(private),那么
即使知道包名其他应用也无法访问。 内部存储空间十分有限,因而显得可贵,另外,它也是系统本身和系统应用程序主要的数据存储所在地,一旦内部存储空间耗尽,手机也就无
法使用了。所以对于内部存储空间,我们要尽量避免使用。Shared Preferences和SQLite数据库都是存储在内部存储空间上的。内部存储一般用Context来获取和操作。

      2.外部存储:最容易混淆的是外部存储,如果说pc上也要区分出外部存储和内部存储的话,那么自带的硬盘算是内部存储,U盘或者移动硬盘算是外部存储,因此我们很容
易带着这样的理解去看待安卓手机,认为机身固有存储是内部存储,而扩展的T卡是外部存储。比如我们任务16GB版本的Nexus 4有16G的内部存储,普通消费者可以这样理解,但
是安卓的编程中不能,这16GB仍然是外部存储。

第二,内部存储路径:/data/data/<package>/      操作方法或形式有:

               1.   SharedPreferences :/data/data/<package>/shared_pref/                      读:Context.getSharedPreferences(String name,int mode)  写:通过Edit

               2.   SQLite:     /data/data/<package>/<dbname>                  通过ContentProvider操作

               3.   IO流:         /data/data/<package>/files/                 

                     如:FileOutputStream fos = context.openFileOutput(file,Context_MODE_WORLD_WRITEABLE);     

               4.  Context:       /data/data/<package>/files/                          

                    如:获取目录 getFilesDir()      String[] files = Context.fileList();

   (小结:其实以上四种方法都是通过Context操作。)


第三,外部存储路径:/mnt/sdcard/

   外部存储虽然概念上有点复杂,但也很好区分,你把手机连接电脑,能被电脑识别的部分就一定是外部存储。
           1.  公共文件Public files: /mnt/sdcard/            [当应用被卸载之后,其卸载前创建的文件仍然保留.  ]

                  getExternalStoragePublicDirectory()

                  Environment.getExternalStorageDirectory() [如果api 版本低于8]

            2.  私有文件Private files: /mnt/sdcard/Android/data/    [卸载之后,这些文件也会被删除]

                  Context.getExternalFilesDir()

                  Environment.getExternalStorageDirectory()  [api 版本低于8,而是用它获得根路径之后,自己再想办法操作/Android/data//下的文件]


第四,apk内部资源: /apk安装路径的apk中:

            InputStream is = getAssets().open("xxx.xx");

            InputStream is = resources.openRawResource.(R.raw.xxx); 


原文地址:http://blog.csdn.net/casun_li/article/details/47318797

参考文档:

              1.http://blog.csdn.net/androidwifi/article/details/17725989

              2.http://blog.csdn.net/heng615975867/article/details/9019633


-------------------------------------------------------------------附学习笔记------------------------------------------------------------------------------------------

5.文件操作(FileXMLSharedPreferences

5.1.读写文件

  • 写入文件

  • 通过Context.openFileOutput(Stringname,int mode)可以获取一个文件输入流

name为文件名,mode为文件模式,有4种模式

输出流指向路径为:/data/data/包名/files/

  • 文件模式在Context中有定义常量

MODE_PRIVATE私有

MODE_WORLD_READABLE其他程序可读(不可写)

MODE_WORLD_WRITEABLE其他程序可写(不可读)

模式可以组合使用,例如:MODE_WORLD_READABLE+ MODE_WORLD_WRITEABLE


MODE_APPEND追加

  • 读取文件

  • 通过Context.openFileInput(Stringname)可以获取一个文件输入流

该输入流可以读取/data/data/包名/files/路径下的文件

  • 获取当前程序Files文件路径

ContextWrapper.getFilesDir()

  • 写入文件到SD

  • 需要在清单文件中注册权限

<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

  • 2.1版本以下的SDCard位置和2.2之后版本不同

可以通过Environment.getExternalStorageDirectory()获取当前SDCard位置,兼容所有版本

  • 获取SDCard状态

通过Environment.getExternalStorageState()方法获取SDCard当前状态

常量Environment.MEDIA_MOUNTED为已安装

5.2.XML解析

  • Pull简介

  • 常见的XML解析方式有三种,DOMSAXPullAndroid系统中推荐使用Pull

  • Pull解析器是一个开源的Java项目,Android系统内部解析XML文件均为此种方式,也可用于JavaEE项目

  • AndroidSDK中已经集成了Pull解析器,无需添加任何jar文件

  • Pull解析器运行方式与SAX类似,提供各种事件的判断

  • 官方网站:http://xmlpull.org/

  • 使用Pull解析器解析XML文件

  • Xml.newPullParser()获得解析器

  • parser.setInput(in,"UTF-8")设置输入流以及编码

  • parser.next()获取下一个解析事件,得到一个事件代码

  • XmlPullParser中定义了常量来标识各种解析事件

START_DOCUMENTEND_DOCUMENTSTART_TAGEND_TAGTEXT

  • 使用XmlSerializer写出XML

  • 使用以下方法生成XML,和XML文档顺序类似

startDocument

startTag

attribute

text

endTag

endDocument

5.3.偏好设定(SharedPreferences

  • 在程序中保存一些配置参数的时候我们经常使用SharedPreferences

Context.getSharedPreferences(Stringname,int mode)

该方法可以在/data/data/<package>/shared_pref/目录下创建一个以name命名的xml文件,mode文件为模式

  • 存储偏好

调用edit()方法可以获取一个Editor对象,对数据进行存储,存储之后需要调用commit()保存到文件

  • 读取偏好

获得SharedPreferences之后调用getString()getInt()等方法获取其中设置的值

  • Activity中获取SharedPreferences

Activity中可以调用getPreferences(intmode)方法获得一个SharedPreferences,文件名和Activity名一致

6.数据库(SQLite

6.1.SQLite特点

  • Android平台中嵌入了一个关系型数据库SQLite,和其他数据库不同的是SQLite存储数据时不区分类型

例如一个字段声明为Integer类型,我们也可以将一个字符串存入,一个字段声明为布尔型,我们也可以存入浮点数。

除非是主键被定义为Integer,这时只能存储64位整数

  • 创建数据库的表时可以不指定数据类型,例如:

CREATETABLE person(id INTEGER PRIMARY KEY, name VARCHAR(20))

CREATETABLE person(id INTEGER PRIMARY KEY, name)

  • SQLite支持大部分标准SQL语句,增删改查语句都是通用的,分页查询语句和MySQL相同

SELECT* FROM person LIMIT 20 OFFSET 10

SELECT* FROM person LIMIT 10,20

6.2.创建数据库

  • 定义类继承SQLiteOpenHelper

  • 声明构造函数,4个参数

  • 重写onCreate()方法

  • 重写upGrade()方法

  • 注意:SQLite数据库中列一旦创建不能修改,如果一定要修改,需要重新创建表,拷贝数据

6.3.CRUD操作

  • JDBC访问数据库不同,操作SQLite数据库无需加载驱动,不用获取连接,直接可以使用

获取SQLiteDatabase对象之后通过该对象直接可以执行SQL语句

SQLiteDatabase.execSQL()

SQLiteDatabase.rawQuery()

  • getReadableDatabase()getWritableDatabase()的区别

查看源代码后我们发现getReadableDatabase()在通常情况下返回的就是getWritableDatabase()拿到的数据库

只有在抛出异常的时候才会以只读方式打开

  • 数据库对象缓存

getWritableDatabase()方法最后会使用一个成员变量记住这个数据库对象,下次打开时判断是否重用

  • SQLiteDatabase封装了insert()delete()update()query()四个方法也可以对数据库进行操作

这些方法封装了部分SQL语句,通过参数进行拼接

6.4.事务管理

  • 在使用SQLite数据库时可以用SQLiteDatabase类中定义的相关方法控制事务

beginTransaction()开启事务

setTransactionSuccessful()设置事务成功标记

endTransaction()结束事务

  • endTransaction()需要放在finally中执行,否则事务只有到超时的时候才自动结束,会降低数据库并发效率


       

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android文件操作的存放位置和形式

标签:

原文地址:http://blog.csdn.net/casun_li/article/details/47318797

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!