APP在保存文件时的存储位置:
Internal Storage指内部存储,每个应用都有属于自己的目录:/data/data/应用程序包名,默认只供本app访问。
External Storage指外部存储,其他app可以访问,用户也可以连接上电脑访问。其有可能是内置的存储卡也可能是可拔插的存储卡。
一、确定保存位置
// 内部存储的默认目录。
// 路径为:/data/data/应用程序包名/files
File internalFilesDir = context.getFilesDir();
// 内部存储的缓存目录。
// 系统内部存储空间不足时,此目录下的文件将被系统删除
// 路径为:/data/data/应用程序包名/cache
File internalCacheDir = context.getCacheDir();
// 外部存储的公开目录。
// 即使APP被卸载,此目录也不会被删除
// 文件类型可以是Environment.DIRECTORY_PICTURES等,以返回相应目录
File externalPublicDir = context.getExternalStoragePublicDirectory(文件类型);
// 外部存储的私有目录
File externalPrivateDir = Environment.getExternalFilesDir(文件类型);
二、写操作
// 1.获取文件输出流
FileOutputStream fos = null;
// 如果文件放在内部存储的默认目录,可以用openFileOutput
// MODE_PRIVATE 表示私有,其他UID不同的程序无法访问
// MODE_APPEND 表示追加不清空,新内容写在原有的后面。
fos = context.openFileOutput("文件名", MODE_PRIVATE | MODE_APPEND);
// 其他位置则:
fos = new FileOutputStream(指定的file, 是否APPEND);
// 2.写数据
fos.write(含有数据的String类型变量.getBytes());
// 3.关闭文件输出流
fos.close();
三、读操作
// 1.获取文件输入流
FileInputStream fis = null;
// 如果文件放在内部存储的默认目录,可以用openFileInput
fis = context.openFileInput("文件名");
// 其他位置则:
fis = new FileInputStream(指定的file);
// 2.读取数据
fis.read(byte[]类型的buffer, byteOffset, byteCount);
String fileContent = new String(buffer);
// 3.关闭文件输入流
fis.close();
四、其他
获取读写External存储的权限:
<manifest ...>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...
</manifest>
确认外部存储是否可以读写:
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) { // 可以读写 }
查询剩余空间:
// 单位:字节
file.getFreeSpace();
删除文件:
// 当文件存放于内部存储的默认目录时:
context.deleteFile("文件名");
// 其他位置则:
file.delete();