Android文件存储
文件存储分内部文件存储和外部存储。
默认情况下应用安装到内部存储,可以通过AndroidMainfest.xml
文件下application
的android:installLocation
属性设置安装位置。
类别 | 内部存储 | 外部存储 |
---|---|---|
可用 | 一直可用 | 没有挂载时不可用 |
可访问性 | 只能被自己的APP访问 | 全部可读 |
删除 | 卸载应用时清除 | 只有通过getExternalFilesDir() 方法返回的路径的文件才会被删除 |
读取外部存储时,需要添加以下权限:
写入的权限已经在SDK>18的版本中默认拥有了
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
内部存储
getFilesDir()
返回app可用的内部存储文件地址。
getCacheDir()
返回app可用的缓存文件地址。当缓存较大并且系统空间不足时会删除其中的文件。
内部存储保存文件:
File file = new File(context.getFilesDir(), filename);
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();
}
设置MODE_PRIVATE
可以使其他应用无法访问文件。
内部存储保存缓存文件:
public File getTempFile(Context context, String url) {
File file;
try {
String fileName = Uri.parse(url).getLastPathSegment();
file = File.createTempFile(fileName, null, context.getCacheDir());
catch (IOException e) {
// Error while creating file
}
return file;
}
外部存储
因为外部存储可能没有被挂载,所以需要先判断是否可用:
/* 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;
}
getExternalStoragePublicDirectory()
返回可以任意访问的外部存储路径,删除应用时不会清除该路径。
getExternalFilesDir()
返回只能自己访问的外部存储路径,删除应用时该目录下的文件会被删除。
getFreeSpace ()
和getTotalSpace ()
会返回路径下的可用空间和全部空间的字节。