Android文件存储

文件存储分内部文件存储和外部存储。

默认情况下应用安装到内部存储,可以通过AndroidMainfest.xml文件下applicationandroid: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" />

内部存储

  1. getFilesDir()

    返回app可用的内部存储文件地址。

  2. 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;
}
  1. getExternalStoragePublicDirectory()

    返回可以任意访问的外部存储路径,删除应用时不会清除该路径。

  2. getExternalFilesDir()

    返回只能自己访问的外部存储路径,删除应用时该目录下的文件会被删除。


getFreeSpace ()getTotalSpace ()会返回路径下的可用空间和全部空间的字节。