使用内部存储器
我们可以直接保存文件在内部存储器上,默认情况下保存在内部存储器上的文件是该应用私有的并且其他应用不能访问。当这个应用被删除之后,这些文件会被删除 。
应用的内部存储器数据保存在/data/data/package-name/ 目录下。
Context提供的几个主要方法:
- openFileOutput() :打开与应用包名关联的私有文件进行写操作,如果文件不存在会自动创建。(文件地址:/data/data/package-name/files/file_name)
- openFileInput() :打开与应用包名关联的私有文件进行读操作。(文件地址:/data/data/package-name/files/file_name)
- getCacheDir():返回应用在文件系统上指定的缓存目录。当存储空间不足的时候,这个目录里的文件会被删除。最好自己进行缓存文件的清理,需要设置一个合理的最大值,比如1M。(返回值:/data/data/package-name/cache/file_name)
- getFilesDir():返回存放openFileOutput文件的目录。(返回值:/data/data/my.android.demo/files)
- getDir(String name, int mode):在应用内部存储中创建或打开一个目录。(返回值:/data/data/my.android.demo/name)
- deleteFile(String name):删除内部存储中的一个文件。
- fileList():返回文件目录中所有文件名。(返回/data/data/package-name/files/ 目录下的文件组成的数组)
使用外部存储器
外部存储上的文件是全局可读的,可以被用户修改,并且可以通过USB传输到电脑上,大部分情况就是指SD card。
1. 先申请权限。
<manifest ...>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...
</manifest>
2. 检查外部存储器的状态,是否可用
/* 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;
}
3.使用public 公开目录,这些目录是共享的,比如 DIRECTORY_MUSIC, DIRECTORY_PICTURES, DIRECTORY_RINGTONES。
通过Environment.getExternalStoragePublicDirectory()可以获取public目录。
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;
}
4. 使用应用私有目录, 应用在SD card上自己的目录。应用卸载后,这个目录会被删除。Media Scanner不会扫描这些目录,所以不能通过MediaStore content provider来查找。
使用Contenxt提供的getExternalFilesDir()来获取目录,这个方法同样需要指定一个type参数(比如 DIRECTORY_MOVIES),传null的话就是根目录。 (目录路径:/storage/emulated/0/Android/data/my.android.demo/files)
// Create a path where we will place our private file on external
// storage.
File file = new File(getExternalFilesDir(null), "DemoFile.jpg");
5. 保存cache文件
通过Context提供的getExternalCacheDir()可以访问保存cache文件的外部存储器目录。(目录路径:/storage/emulated/0/Android/data/my.android.demo/cache/)