其他
Android 文件系统小记
https://juejin.cn/post/7400317170083463195
私有性:数据对应用本身可见,其他应用无法访问。 安全性:在设备被擦除或应用被卸载时,这些数据会被删除。 权限:不需要申请额外权限。
路径:/data/data/<package_name>/files/ API:Context.getFilesDir() 使用场景:存储应用的配置文件、用户数据等私有文件。
File myFile = new File(filesDir, "myfile.txt");
路径:/data/data/<package_name>/cache/ API:Context.getCacheDir() 使用场景:存储临时数据或缓存文件,系统在需要时可以清除这些文件。
File tempFile = new File(cacheDir, "tempfile.tmp");
路径:/data/data/<package_name>/code_cache/ API:Context.getCodeCacheDir() 使用场景:存储优化后的代码或编译后的代码缓存。
File internalDir = context.getFilesDir(); // /data/data/<package_name>/files
// 写文件
File file = new File(internalDir, "example.txt");
try (FileOutputStream fos = new FileOutputStream(file)) {
fos.write("Hello, World!".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
// 读文件
try (FileInputStream fis = new FileInputStream(file)) {
byte[] data = new byte[(int) file.length()];
fis.read(data);
String content = new String(data, "UTF-8");
System.out.println(content);
} catch (IOException e) {
e.printStackTrace();
}
数据对用户和其他应用可见。 用户卸载应用时,这些数据不会被删除。 需要申请读写权限。
数据对应用本身可见,其他应用无法访问。 应用卸载时,这些数据会被删除。 需要申请读写权限。
路径:/storage/emulated/0/ 或特定的公共目录,如Downloads,Pictures,DCIM,Music,Movies API:Environment.getExternalStoragePublicDirectory(String type) 使用场景:存储用户可见的文件,如下载的文件、媒体文件等。
File publicFile = new File(publicDir, "downloadedfile.txt");
路径:/storage/emulated/0/Android/data/<package_name>/files/ API:Context.getExternalFilesDir(String type) 使用场景:存储应用的私有文件,用户可以通过文件管理器访问,应用卸载时这些文件会被删除。
File appSpecificFile = new File(appSpecificDir, "appfile.txt");
路径:/storage/emulated/0/Android/data/<package_name>/cache/ API:Context.getExternalCacheDir() 使用场景:存储临时缓存文件,系统在需要时可以清除这些文件。
File tempExternalFile = new File(externalCacheDir, "tempfile.tmp");
File publicDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
// 获取应用专属外部存储目录
File privateDir = context.getExternalFilesDir(null);
// 写文件到公共外部存储
File publicFile = new File(publicDir, "public_example.txt");
try (FileOutputStream fos = new FileOutputStream(publicFile)) {
fos.write("Hello, Public World!".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
// 写文件到应用专属外部存储
File privateFile = new File(privateDir, "private_example.txt");
try (FileOutputStream fos = new FileOutputStream(privateFile)) {
fos.write("Hello, Private World!".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
// 动态申请权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_WRITE_STORAGE);
}
内部缓存:context.getCacheDir(),路径为 /data/data/<package_name>/cache/ 外部缓存:context.getExternalCacheDir(),路径为 /storage/emulated/0/Android/data/<package_name>/cache/
自动管理:缓存目录中的文件是临时文件,系统在需要空间时会自动清理这些文件。 清除策略:当设备存储空间不足时,系统可能会删除缓存目录中的文件以释放空间。开发者无需手动管理这些文件的生命周期。
临时存储:适用于存储临时数据,如图片缓存、网络请求缓存等。缓存文件不需要持久保存,可以随时重新生成。 快速访问:由于缓存目录通常存储在设备的内部存储中,因此访问速度较快,适合需要高效读写操作的临时数据。
自动管理:系统自动清理,开发者无需手动管理。 私有安全:仅对应用本身可见,确保数据安全。 无需权限:简化了开发流程。适用场景:临时文件存储、缓存数据等。
读写公共外部存储:需要申请 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 权限。 应用专属外部存储:从 Android 10 开始,应用可以不需要申请权限直接访问自己的专属外部存储。