Android文件存储

2018-02-01  本文已影响44人  清风流苏

File对象适合顺序不跳过地读取和写入大量数据。例如,图片文件或通过网络交换的任何内容。

存储区域

Android设备有两个文件存储区域:“内部”和“外部”存储。早期设备“内部存储”指的是内置存储,而“外部存储”指的是外置可拆卸的移动存储,比如SD卡。现在基本上没有外置移动存储,而依然将存储区域划分为这两部分。

内部存储

不希望用户或其他应用访问的那些文件信息,可以放到这里。

外部存储

外部存储适用于存放那些无需访问限制,以及你希望共享给其他应用或允许用户使用电脑访问的文件。

应用默认安装在内部存储中,可以修改应用清单文件中的android:installLocation属性来指定默认安装位置。

获取访问外部存储的权限

当前应用默认具有外部存储读取权限,而写权限必须申请。后续版本可能会要求申请外部存储区域读权限。

获取外部存储写权限,隐含外部区域读权限,反之不成立。

获取写权限

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

获取读权限

<manifest ...>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    ...
</manifest>

应用始终具有读写内部存储区域的权限,无需申请。

保存文件到内部存储

内部应用存储空间根目录通常是/data/data/<package-name>/

获取缓存目录的方法(Context类提供):

在目录下创建文件,File的构造参数中传入目录和文件名,例如

File file = new File(context.getFilesDir(), filename);

或者,调用openFileOutput()方法获取写入到getFilesDir()目录的FileOutputStream。比如,在getFilesDir()目录下写入一个名为myfile.txt的文件,内容为Hello world!

String filename = "myfile.txt";
String string = "Hello world!";
FileOutputStream outputStream;

try {
  outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
  outputStream.write(string.getBytes());
  outputStream.close();
} catch (Exception e) {
  e.printStackTrace();
}

保存文件到外部存储

外部存储可能不可用,比如用户将其挂载到了电脑或者移除了提供外部存储的SD卡,因此,在访问之前,需要先确认其可用。

调用getExternalStorageState()方法查询外部存储状态,如果返回为MEDIA_MOUNTED,表示可用,这时你可以对其进行读写。

检查外部磁盘是否可用于读写操作:

/* 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()方法获取,需要指定文件类型参数,以便外部统一处理。比如DIRECTORY_MUSICDIRECTORY_PICTURES。比如:

public File getAlbumStorageDir(String albumName) {
    // Get the directory for the user's public pictures directory.
    File file = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES), albumName);
    if (!file.mkdirs()) {
        Log.e(LOG_TAG, "Directory not created");
    }
    return file;
}

应用卸载时,系统不会删除这些文件。

私有文件目录获取

调用getExternalFilesDir()方法传入目录名字获取相应目录。当用户卸载应用时候,系统会删除这些文件。

比如,使用下面方法创建个人相册目录:

public File getAlbumStorageDir(Context context, String albumName) {
    // Get the directory for the app's private pictures directory.
    File file = new File(context.getExternalFilesDir(
            Environment.DIRECTORY_PICTURES), albumName);
    if (!file.mkdirs()) {
        Log.e(LOG_TAG, "Directory not created");
    }
    return file;
}

上述方法会在Environment.DIRECTORY_PICTURES目录下创建albumName值的目录,当然你也可以将第一个参数传为null,则会在你应用外部存储私有目录的根目录下创建。

查询可用空间

File类的getFreeSpace()getTotalSpace()返回当前目录下可用空间和总的空间大小。

但是,系统并不保证你能够写入getFreeSpace()大小的数据。如果可用空间大小比你要保存的数据多几MB,或者文件系统剩余空间大小超过10%,你多半是可以安全写入。否则的话,你可能不应该写入存储。

写入之前也可以不检查磁盘可用量,可以尝试写入,然后在IOException发生时捕获。

删除文件

记住,文件不用了就及早删除。删除文件的方法:

File.delete()

如果文件保存在内部存储中,还可以调用Context.deleteFile(fileName)来定位和删除文件。

注:当用户卸载您的应用时,Android 系统会删除以下各项:

上一篇 下一篇

猜你喜欢

热点阅读