Android Saving Files 简介 + 实例源码
首先我们要知道Android 内部存储 (Internel Storage)和 外部存储(External Storage) 的存储的分类。
Internel Storage : 通常就是手机自带的内存(Flash),这个存储空间,总是可用的,文件默认保存到
这里,卸载应用程序时,与程序相关的文件将一并被自动删除。
Externel Storage : 通常就是 SD 内存卡,可知他并不是总是可用的,它可能被卸载(unmount)。它总
是可读的(world-readable),应用程序被卸载时,系统自动删除通过 getExternalFilesDir()
得到的目录下的文件。
Internel 有读写限制,而Externel没有,但是在将来会被实现限制功能。
1.当使用 SD 卡时,要 加上 写(write) Permissions
<manifest ...> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ... </manifest>对于 读(Read) 权限,现在,所有的应用 有能力读而不需 Permissions
但是这个 Read 权限功能,将会在未来某个发布版本中添加,为了你的应用的可持续,所以有必要添加
Read 权限
<manifest ...> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> ... </manifest>2.Internel Storage 文件操作
应用的存储路径被你应用的包名(package name)指定,
在Android 文件系统的特殊位置:
创建的文件存放在/data/data/<package name>/files目录下。
我们用 Context.getCacheDir() 或 Context.getFilesDir() 来获取。
其中 Context.getCacheDir()是得到的 cache 目录。
①创建文件
File file = new File(context.getFilesDir(), filename);②写文件 用 FileOutputStream 流对象操作
String filename = "myfile"; String string = "Hello world!"; FileOutputStream outputStream; try { outputStream = openFileOutput(filename, Context.MODE_PRIVATE); outputStream.write(string.getBytes()); outputStream.close(); } catch (Exception e) { e.printStackTrace(); }
PS: filename 不能包含路径,只是单纯的文件名。
FileOutputStream openFileOutput (String name, int mode)
可能抛出(throw) FileNotFoundExecption。
name | The name of the file to open; can not contain path separators. |
---|---|
mode |
Operating mode. Use 0 or MODE_PRIVATE for
the default operation, MODE_APPEND to
append to an existing file, MODE_WORLD_READABLE and MODE_WORLD_WRITEABLE to
control permissions. |
③保存文件 Save a File
④删除文件 调用 Context
的deleteFile(): 方法。
myContext.deleteFile(fileName);
3.External Storage 文件操作
① 对于 SD 内存卡,我们操作之前要先检验一下是否挂载。
用 String Environment.getExternalStorageState() 得到状态。
/* Checks if external storage is available for read and write */ public boolean isExternalStorageWritable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { return true; } return false; } /* Checks if external storage is available to at least read */ public boolean isExternalStorageReadable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { return true; } return false; }
②External 文件分为 Public files 和 Private files 两种。
对于 External 目录的获取,
Public files 用
public static File getExternalStoragePublicDirectory (String type)
getExternalFilesDir() 或者
Context.getExternalFilesDir()
File file = new File(context.getExternalFilesDir( Environment.DIRECTORY_PICTURES), albumName);
File file = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES), albumName);当然目录可能不存在
if (!file.mkdirs()) { Log.e(LOG_TAG, "Directory not created");③
④调用文件对象的 delete() 方法。
myFile.delete();
最后
当你卸载应用程序时,系统将自动删除以下文件::
- 此程序存储在 Internal Storage 里的所有文件
- 此程序使用
getExternalFilesDir()保存在
. external storage 里的文件。 - 但是, 但是你需要手动删除 用getCacheDir() 创建的 cached files 和不再需要的其他文件。.