易错点
READ_OWNER_DATA是废弃无效权限,不能用于文件读写。- 代码使用
SpecialFolder.Personal→ 应用私有内部存储,不需要任何存储权限。
只有访问手机公共共享文件夹(Download、图片目录),才需要申请存储权限。
核心API
| 代码 | 作用 |
|---|---|
System.Environment.GetFolderPath(SpecialFolder.Personal) | App私有文件夹,卸载APP文件自动删除,其他App无法访问 |
Path.Combine(path,"myfile.txt") | 安全拼接目录+文件名,自动处理斜杠 |
StreamWriter(path, true) | 写文本;第二个参数true=追加写入;false=覆盖重写 |
StreamReader | 读取文本文件 |
using(){} | 自动释放文件流资源,不用手动调用Close() |
ReadToEnd() | 一次性读取文件全部内容 |
代码
using System;
using System.IO;
private void Btn_Click1(object sender, EventArgs e)
{
// 获取应用私有存储目录
string path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
// 拼接完整文件路径
string filename = Path.Combine(path, "myfile.txt");
// 写入文件,true代表追加
using (var streamWriter = new StreamWriter(filename, true))
{
streamWriter.WriteLine(DateTime.UtcNow);
}
// 读取全部文件内容
using (var streamReader = new StreamReader(filename))
{
string content = streamReader.ReadToEnd();
Console.WriteLine(content);
}
}Code language: JavaScript (javascript)
补充
- 文件保存位置:
/data/data/包名/files/myfile.txt,普通文件管理器看不到,只有Android Studio设备文件浏览器可以查看。 - 如果要写到手机外部公共存储,才需要在AndroidManifest添加权限,高版本Android还要动态申请权限。
using离开大括号会自动Dispose关闭流,防止文件被占用。
对比 SharedPreferences 和 文件存储
- SharedPreferences:适合保存少量键值对(开关、配置),底层本质也是xml小文件。
- StreamWriter/StreamReader文件读写:适合保存大量文本、日志。

Previous: 临时存储 SharedPreferences
Next: 序列化对象到文件