Android 之 访问应用专属文件
参考网页
在很多情况下,您的应用会创建其他应用不需要访问或不应访问的文件。系统提供以下位置,用于存储此类应用专属文件:
内部存储空间目录:这些目录既包括用于存储持久性文件的专属位置,也包括用于存储缓存数据的其他位置。系统会阻止其他应用访问这些位置,并且在 Android 10(API 级别 29)及更高版本中,系统会对这些位置进行加密。这些特征使得这些位置非常适合存储只有应用本身才能访问的敏感数据。
外部存储空间目录:这些目录既包括用于存储持久性文件的专属位置,也包括用于存储缓存数据的其他位置。虽然其他应用可以在具有适当权限的情况下访问这些目录,但存储在这些目录中的文件仅供您的应用使用。如果您明确打算创建其他应用能够访问的文件,您的应用应改为将这些文件存储在外部存储空间的共享存储空间部分。
如果用户卸载应用,系统会移除保存在应用专属存储空间中的文件。由于这一行为,您不应使用此存储空间保存用户希望独立于应用而保留的任何内容。例如,如果应用允许用户拍摄照片,用户会希望即使卸载应用后仍可访问这些照片。因此,您应改为使用共享存储空间将此类文件保存到适当的媒体集合中。
一、从内部存储空间访问
对于每个应用,系统都会在内部存储空间中提供目录,应用可以在该存储空间中整理其文件。一个目录专为应用的持久性文件而设计,而另一个目录包含应用的缓存文件。您的应用不需要任何系统权限即可读取和写入这些目录中的文件。
其他应用无法访问存储在内部存储空间中的文件。这使得内部存储空间非常适合存储其他应用不应访问的应用数据。
但是,请注意,这些目录的空间通常比较小。在将应用专属文件写入内部存储空间之前,应用应查询设备上的可用空间。
1.1 访问持久性文件
应用的普通持久性文件位于您可以使用上下文对象的 filesDir
属性访问的目录中。此框架提供了多种方法帮助您在此目录中访问和存储文件。
访问和存储文件
1.您可以使用 File
API 访问和存储文件:
File file = new File(context.getFilesDir(), filename);
2.使用信息流存储文件
除使用 File
API 之外,您还可以调用 openFileOutput()
获取会写入 filesDir 目录中的文件的 FileOutputStream
。
代码如下所示:
//MainActivity.java中
//写入文件
String filename = "myfile";
String fileContents = "Hello world!";
try (FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE)) {
fos.write(fileContents.getBytes());
}catch (Exception e){
e.printStackTrace();
}
//从文件读出并显示在TextView中
try {
String result=myreadFile(filename);
TextView tv=(TextView)findViewById(R.