保存内容到文件
- 保存到内部存储(Internal Storage)
- 保存到外部存储(External Storage)
内部与外部存储比较
内部存储
- 总是可用
- 保存的文件只能被当前应用访问
- 用户卸载应用后,内部存储保存的文件会被全部删除
外部存储
- 当用户挂载外部存储(SD卡)时可用,卸载后无法使用
- 其他应用可以访问
- 用户卸载应用后,系统将会删除通过getExternalFilesDir()创建的目录
保存文件到内部存储
- getFilesDir()返回应用内部存储根目录
- getCacheDir()返回应用内部存储缓存目录
创建文件
1
File file = new File(context.getFilesDir(), filename);
通过openFileOutput或者FileOutputStream
1
2
3
4
5
6
7
8
9
10String 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();
}创建缓存文件
1
2
3
4
5
6
7
8
9
10public 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;
}
保存文件到外部存储
获取外部存储状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17/* 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 storage对于用户与其他app是可以修改的,但有2类文件可以保存在external storage中:
- Public files这些文件对与用户与其他app来说是public的,当用户卸载你的app时,这些文件应该保留。例如,那些被你的app拍摄的图片或者下载的文件。
- Private files对其他app无意义的,当用户卸载你的app时,系统会删除你的app的private目录。例如,那些被你的app下载的缓存文件。
如果你想要保存文件为public形式的,用getExternalStoragePublicDirectory()方法来获取一个 File 对象来表示存储在external storage的目录。
1
2
3
4
5
6
7
8
9public 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()来获取相应的目录,并且传递一个指示文件类型的参数。
1
2
3
4
5
6
7
8
9public 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;
}
查询剩余空间
- 通过执行getFreeSpace() or getTotalSpace() 来判断是否有足够的空间来保存文件,从而避免发生IOException。
删除文件
- 删除文件
myFile.delete()
- 如果文件是保存在internal storage,你可以通过Context来访问并通过执行deleteFile()进行删除
myContext.deleteFile(fileName);
当用户卸载你的app时,android系统会删除以下文件:
所有保存到internal storage的文件。
所有使用getExternalFilesDir()方式保存在external storage的文件。
然而,通常来说,你应该手动删除所有通过 getCacheDir() 方式创建的缓存文件,以及那些不会再用到的文件。
- 删除文件