数据保存(二):文件

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();

你可能感兴趣的:(读写文件)