Android数据存储之文件存储
目录结构
l 概述
l 内部存储
l 外部存储
l 总结
1概述
Android的文件存储区别于sharedPreferences方式的键值对,也区别于关系型数据库的SQLite存储。对于文件数据类型如文本、音频、视频等的存储上述两种方式不可行。Android提供了对文件存储的支持。根据文件的访问权限,可以将私有的不被其他应用程序访问的文件作为内部存储,当应用被卸载时,文件也被销毁;希望被其他应用程序共享的音频、视频等文件可以作为外部存储存储在SD卡上,当应用被卸载时,文件依旧被保留下来,供其他应用程序访问。
2 内部存储
2.1写操作:
ü 调用openFileOutput(),传入文件名和操作模式这两个参数,返回输出流FileOutputStream.
ü Write()写入文件
ü Close()关闭输出流
小实例:
String FILENAME = “myFile.txt”;
String string ="hello world!";
FileOutputStream fos =openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes(“UTF-8”));
fos.close();
在Activity中运行,在Eclipse的File Explorer窗口中即可看到刚新建的文件,如图:
图片中可以清晰的看出新建文件在内部存储中的目录结构。
MODE_PRIVATE表明创建文件的权限是私有的,其他的模式有:MODE_APPEND,MODE_WORLD_READABLE,MODE_WORLD_WRITEABLE
2.2读操作:
ü 调用openFileInput(),传入文件名参数,返回一个输入流FileInputStream
ü Read()读取字节
ü Close()关闭输入流
如果你需要在应用启动中调用静态文件,可以将静态文件保存在如下工程路径下:res/raw/
在读取时调用方法openRawResource(),传入R.raw.<filename>资源ID,返回一个输入流InputStream。
2.3 保存缓存文件
对于有些缓存文件的存储,使用getCacheDir()打开一个File文件保存。当设备的内部可用空间过低时,android系统将会删除一些缓存文件以释放出空间来。当然,你不能总指望系统给你清理这些缓存,我们应该限制缓存文件的大小,例如1MB的上限,以让应用能够稳定的运行。当用户卸载应用程序时,这些缓存文件也跟着被删掉。
2.4 其他一些有用的方法
GetFilesDir()
获得通过内部存储方式存储的文件的绝对路径。如上面的小例子返回的绝对路径是:
/data/data/com.aaron.learn/files
getDir()
在当前内部存储中新建(如果存在则打开)指定名字的文件夹
deleteFile()
删除内部存储上的指定文件
fileList()
返回当前应用程序保存的所有文件列表
值得注意的是,当我们调用getDir("myFolder", Context.MODE_PRIVATE);新建的文件夹名并不是指定的”myFolder”,而是系统默认在其前面加上了前缀:app_,如图所示:
3 外部存储
3.1 检查外部存储介质是否可用
在需要使用外部存储时,如SD卡,首先得检查存储介质是否可用。通过调用getExternalStorageState()返回String类型的状态码来确定是否可用,是否只读等。下面的代码片段就是检测存储介质的小实例:
booleanmExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false;
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
// We canread and write the media
mExternalStorageAvailable = mExternalStorageWriteable = true;
} else if(Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
// We canonly read the media
mExternalStorageAvailable = true;
mExternalStorageWriteable = false;
} else {
//Something else is wrong. It may be one of many other states, but all we need
// to know is we can neither read nor write
mExternalStorageAvailable =mExternalStorageWriteable = false;
}
3.2 访问外部存储文件
在API8或更高版本中提供方法getExternalFilesDir()打开外部存储路径。其他版本的API中,使用getExternalStorageDirectory()方法。
3.3 保存共享文件
如果不希望某些文件在应用程序卸载时被删掉,可以在外部存储介质中开辟一个公共的文件目录来存储,比如:Music/,Picture/,RingTone/等。
在AIP8 或更高版本中,使用getExternalStoragePublicDirectory(),传入文件类型参数,如DIRECTORY_MUSIC,DIRECTORY_PICTURES,DIRECTORY_RINGTONES等等:
Ø DIRECTORY_ALARMS – 警告铃音
Ø DIRECTORY_DCIM – 摄像头拍下的照片或者视频
Ø DIRECTORY_DOWNLOADS – 用户下载的文件
Ø DIRECTORY_MOVIES – 电影
Ø DIRECTORY_MUSIC – 音乐
Ø DIRECTORY_NOTIFICATIONS – 提示铃音
Ø DIRECTORY_PICTURES – 图片
Ø DIRECTORY_PODCASTS – 数字广播
Ø DIRECTORY_RINGTONES – 来电铃声
3.4 缓存文件
使用getExternalCacheDir()打开外部存储路径。
4 总结
1.Android提供的文件存储API基本上是Java平台的IO操作,因此,对于java开发人员很容易理解和掌握。
2.Android文件系统权限。观察一下FileExplorer窗口,在Permissions列,有些形如drw--w---x的字符串。
由于Android是基于Linux开发的,因此Android系统文件权限实际就是Linux权限。在Linux中,一个文件的权限有3个组别:用户、群组、其他。其中每个组包含三种权限:读(r)、写(w)、执行(x)。这样来说,每个文件就有9个权限属性。其中d表示这是一个目录。
例如:-rw--w---x中,用户对其享有读和写的权限、群组对其享有写的权限,其他享有执行的权限。
更多相关文章
- Android的配置文件操作的完美封装(使用注解 反射让配置文件操作如
- 【Android 内存优化】使用 Memory Analyzer ( MAT ) 工具分析内
- Android 中下载文件到sdcard和进度条小结
- android 内部文件读取
- 将Android工程做成jar包和资源文件
- Android 文件保存getFilesDir()丶getCacheDir()、getExternalFil