好的,让我们更全面地深入 Android 文件系统的各个方面,包括所有主要目录及其用途,以及文件系统的架构和管理。
1. Android 文件系统结构
Android 文件系统主要由以下几个重要目录组成,每个目录都有其特定的功能和数据存储方式:
根目录(/)
- 文件系统的起始点,所有其他目录都在此之下。
/system
- 存储 Android 操作系统核心文件和系统应用程序。
- 包含
/system/app
和/system/priv-app
目录,分别存放系统应用和具有特权的系统应用。 - 该目录通常是只读的,除非设备经过 root 权限或系统更新。
/data
- 存储用户应用的数据,是 Android 文件系统中最重要的部分。
- 每个应用在此目录下都有一个独立的子目录,路径为
/data/data/<package_name>/
,存储应用的私有数据(如数据库、文件等)。 - 包含
/data/app
目录,存放已安装的 APK 文件。 - 该目录通常只能被应用自身访问,确保数据安全。
/cache
- 用于存储临时文件和缓存数据,例如应用的缓存内容。
- 存储的文件在设备需要空间时可能被清除。
/vendor
- 存储由设备制造商提供的自定义硬件驱动和系统组件。
- 允许硬件制造商为特定设备添加自定义功能而不影响 Android 操作系统的核心部分。
/storage
- 包含外部存储的目录,通常映射到设备的 SD 卡或内部存储。
- 包括
/storage/emulated/0/
代表用户的外部存储,通常是可访问的。
/proc
- 虚拟文件系统,提供关于系统进程和内核的信息。
- 主要用于调试和监控,不是应用程序存储数据的地方。
/sys
- 另一个虚拟文件系统,用于提供关于内核和系统硬件的信息。
- 包含设备驱动程序的信息,可以通过此目录监控硬件状态。
/dev
- 包含设备文件,用于与硬件设备进行交互。
- 主要用于底层硬件访问。
/mnt
- 用于挂载外部存储设备的点,通常会包含指向实际存储位置的符号链接。
/lost+found
- 在文件系统崩溃后,存放恢复的文件碎片。
2. 其他重要概念
文件权限和安全性
- Android 应用使用 Linux 权限模型,每个应用作为独立的用户运行。
- 应用需在
AndroidManifest.xml
中声明权限,某些权限(如外部存储)需要在运行时请求。
存储选项
- 内部存储:适合存储私有数据,应用使用
Context.getFilesDir()
获取路径。 - 外部存储:适合存储可共享数据,使用
Environment.getExternalStorageDirectory()
获取路径。 - 缓存存储:使用
getCacheDir()
和getExternalCacheDir()
存储缓存数据。
- 内部存储:适合存储私有数据,应用使用
数据持久性
- SQLite 数据库:适用于结构化数据存储,使用
SQLiteOpenHelper
类进行管理。 - SharedPreferences:适用于保存轻量级的键值对数据。
- SQLite 数据库:适用于结构化数据存储,使用
3. 文件操作的代码示例
以下是一些常见的文件操作示例,展示如何在 Android 中读取和写入文件:
写入文件到内部存储
java
String filename = "example.txt";
String fileContents = "Hello, Android!";
try (FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE)) {
fos.write(fileContents.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
从内部存储读取文件
java
try (FileInputStream fis = openFileInput(filename)) {
StringBuilder stringBuilder = new StringBuilder();
int c;
while ((c = fis.read()) != -1) {
stringBuilder.append((char) c);
}
String fileData = stringBuilder.toString();
Log.d("FileData", fileData);
} catch (IOException e) {
e.printStackTrace();
}
使用 External Storage API 写入文件
java
String fileName = "external_example.txt";
File file = new File(Environment.getExternalStorageDirectory(), fileName);
try (FileOutputStream fos = new FileOutputStream(file)) {
fos.write("Hello from external storage!".getBytes());
} catch (IOException e) {
e.printStackTrace();
}