Android 文件存储系统原理
Android 在文件存储方面提供了多种方式,最常见的包括内部存储和外部存储。内部存储是指应用程序专用的数据存储位置,而外部存储则是指 SD 卡等外部存储设备。本文将重点介绍 Android 文件存储系统的原理及使用方法。
Android 文件存储系统的原理
在 Android 中,文件系统是以含有 Android 文件系统的分区为基础的。Android 文件系统分为两个部分,分别是内部存储和外部存储。
内部存储
内部存储是指应用程序专用的数据存储位置。这些数据只能被相应应用程序访问,其他程序无法直接访问。
内部存储分两部分:应用数据和应用代码。应用数据的存储位置为 /data/data/package_name 目录下,其中 package_name 是指应用程序的包名。在该目录下,应用程序可以存储任何数据,包括数据库文件、SharedPreferences 等。应用代码则默认存储在 /data/app/package_name-x.apk 目录下,其中 x 是应用版本名。一般情况下,Android 将应用代码存储在只读文件系统中,以保证应用程序的安全性。
外部存储
外部存储则是指 SD 卡等外部存储设备。Android 4.4 开始,Google 引入了新的存储访问框架,也就是 SAF(Storage Access Framework)。SAF 允许应用程序通过标准的文件选择对话框等方式访问外部存储设备,以及对外部存储设备进行读写操作。
在 SAF 中,应用程序通过 Intent 启动系统文件选择器(Intent.ACTION_OPEN_DOCUMENT 或 Intent.ACTION_CREATE_DOCUMENT),然后用户可以选择需要访问的文件或创建新文件。应用程序可以获得该文件的 Uri,然后通过 ContentResolver 对该文件进行读写操作。SAF 支持的是文档中心模式,即应用程序可以在 DocumentProvider 中提供自己的文件。
Android 文件存储系统的使用方法
获取内部存储路径
应用程序可以通过 Context 的 getFilesDir() 方法获取内部存储路径。例如:
File filesDir = context.getFilesDir();
获取应用数据存储路径
应用程序可以通过 Context 的 getDir() 方法获取应用数据存储路径。例如:
File dataDir = context.getDir("mydata", Context.MODE_PRIVATE);
读写文件
应用程序可以通过 FileInputStream 和 FileOutputStream 完成文件读写。例如:
FileOutputStream outputStream = context.openFileOutput("my.txt", Context.MODE_PRIVATE);
outputStream.write("Hello, world!".getBytes());
outputStream.close();
FileInputStream inputStream = context.openFileInput("my.txt");
byte[] bytes = new byte[1024];
int len = inputStream.read(bytes);
String content = new String(bytes, 0, len);
inputStream.close();
使用 SAF 在外部存储中创建文件
应用程序可以通过 SAF 在外部存储中创建文件。例如:
Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TITLE, "my.txt");
startActivityForResult(intent, CREATE_FILE_REQUEST_CODE);
在 onActivityResult 方法中,应用程序可以获取到用户选择的文件的 Uri,然后通过 ContentResolver 进行文件写入操作。例如:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
if (requestCode == CREATE_FILE_REQUEST_CODE && resultCode == RESULT_OK) {
Uri uri = resultData.getData();
try (ParcelFileDescriptor pfd = getContentResolver().openFileDescriptor(uri, "w")) {
FileOutputStream outputStream = new FileOutputStream(pfd.getFileDescriptor());
outputStream.write("Hello, world!".getBytes());
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
示例说明
下面给出两个示例,分别是读写内部存储中的文件和在外部存储中创建文件。这些示例代码可以帮助您更好地理解 Android 文件存储系统的原理和使用方法。
示例一:读写内部存储中的文件
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
File file = new File(getFilesDir(), "my.txt");
FileOutputStream outputStream = new FileOutputStream(file);
outputStream.write("Hello, world!".getBytes());
outputStream.close();
FileInputStream inputStream = new FileInputStream(file);
byte[] bytes = new byte[1024];
int len = inputStream.read(bytes);
String content = new String(bytes, 0, len);
inputStream.close();
TextView textView = findViewById(R.id.text_view);
textView.setText(content);
} catch (IOException e) {
e.printStackTrace();
}
}
}
在该示例代码中,应用程序先使用 FileOutputStream 将字符串写入 my.txt 文件中,然后使用 FileInputStream 读取该文件内容,并将其显示在 TextView 中。
示例二:在外部存储中创建文件
public class MainActivity extends AppCompatActivity {
private static final int CREATE_FILE_REQUEST_CODE = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button).setOnClickListener(v -> {
Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TITLE, "my.txt");
startActivityForResult(intent, CREATE_FILE_REQUEST_CODE);
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent resultData) {
super.onActivityResult(requestCode, resultCode, resultData);
if (requestCode == CREATE_FILE_REQUEST_CODE && resultCode == RESULT_OK) {
Uri uri = resultData.getData();
try (ParcelFileDescriptor pfd = getContentResolver().openFileDescriptor(uri, "w")) {
FileOutputStream outputStream = new FileOutputStream(pfd.getFileDescriptor());
outputStream.write("Hello, world!".getBytes());
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
在该示例代码中,应用程序先在界面中显示一个按钮。当用户点击按钮时,会跳出文件选择器,让用户选择文件路径和文件名。当用户完成选择后,应用程序将使用 ContentResolver 将字符串写入该文件中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android 文件存储系统原理 - Python技术站