安卓存储
- 本篇用于记录关于安卓开发中存储的操作。
0.file 类
File
类是 Java 标准库中用于处理文件和目录的类。以下是关于 File
类的详细解释:
-
创建 File 实例:
- 通过提供文件路径或者目录路径创建
File
对象,例如:File file = new File("path/to/file.txt");
- 通过提供文件路径或者目录路径创建
-
文件和目录操作:
-
file.exists()
: 检查文件或目录是否存在。 -
file.isFile()
: 检查是否是文件。 -
file.isDirectory()
: 检查是否是目录。 -
file.getName()
: 获取文件或目录的名称。 -
file.getAbsolutePath()
: 获取文件或目录的绝对路径。
-
-
文件信息获取:
-
file.length()
: 获取文件的长度(字节数)。 -
file.lastModified()
: 获取文件最后修改时间的时间戳。
-
-
文件操作:
-
file.createNewFile()
: 创建新文件。 -
file.delete()
: 删除文件或空目录。 -
file.renameTo(newName)
: 重命名文件或目录。
-
-
目录操作:
-
file.mkdir()
: 创建目录。 -
file.mkdirs()
: 创建多级目录。 -
file.list()
: 返回目录下的文件和子目录的数组。
-
-
遍历目录:
- 使用递归或者
FileVisitor
接口遍历目录结构。
- 使用递归或者
-
注意事项:
-
File
类主要用于文件和目录的元数据操作,不涉及文件内容的读写。 -
在新的 Java 版本中,推荐使用
java.nio.file.Path
和相关的类进行更强大和灵活的文件操作。
-
File
类提供了简单的文件和目录操作
但在现代 Java 应用中,特别是涉及复杂的文件操作时,更推荐使用 java.nio.file
包。
0.1 java.nio.file
java.nio.file
包是 Java 7 引入的一组处理文件和目录的新 I/O API。以下是关于 java.nio.file
包的重要概念和功能:
-
Path
接口:-
代表文件系统中的路径。
-
通过
Paths
工具类创建Path
对象。
Path path = Paths.get("path/to/file.txt");
-
-
文件和目录操作:
Files
工具类提供了丰富的文件和目录操作方法。
// 检查文件或目录是否存在 boolean exists = Files.exists(path); // 创建目录 Files.createDirectory(path); // 复制文件或目录 Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING); // 删除文件或目录 Files.delete(path);
-
读写文件:
- 使用
BufferedReader
和BufferedWriter
进行文本文件读写。
// 读取文本文件 List<String> lines = Files.readAllLines(path); // 写入文本文件 Files.write(path, lines);
- 使用
-
遍历目录:
- 使用
Files.walkFileTree
方法或Files.newDirectoryStream
进行目录遍历。
// 遍历目录并处理每个文件 Files.walkFileTree(directoryPath, new MyFileVisitor());
- 使用
-
文件属性和元数据:
- 获取文件属性和元数据,如大小、修改时间等。
// 获取文件大小 long size = Files.size(path); // 获取文件最后修改时间 FileTime lastModifiedTime = Files.getLastModifiedTime(path);
-
文件 WatchService:
- 监视文件或目录的变化。
WatchService watchService = FileSystems.getDefault().newWatchService(); path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
java.nio.file
包提供了更灵活和功能强大的文件和目录操作,适用于现代 Java 应用的需求。
安卓存储分为两种
这张图很好的概括了外部存储和内部存储
1.内部存储(Internal Storage)
特点:会随应用卸载而被删除
不需要用户权限
不能被其他应用访问
存储路径:
/data/data/< applicationId,就是包名 >/shared_prefs
/data/data/< applicationId >/databases
/data/data/< applicationId >/files 通过 context.getFilesDir() 获取该目录
/data/data/< applicationId >/cache 通过 context.getCacheDir() 获取该目录
如下图
- 但是,当我使用 getFilesDir()函数时,获取到的地址却是
没错,你可以看到地址输出为/data/user/0/<applicationld>/files/,这是因为安卓在多用户环境下为每个用户分配了一块数据目录来进行数据隔离,这块获取的路径仍然是应用的私有存储空间。经过测试发现,在 data/user/0 中进行的文件操作都会映射到/data/data 的相同位置。
File internalStorageDir = getFilesDir(); //在activity中可以这样用,在fragment中需要用
//File internalStorageDir =getContext().getFilesDir();
File directory = new File(internalStorageDir, "avatar");
String avatarPath= directory.getAbsolutePath()+"/";
directory.mkdirs(); //创建目录 可以得到/data/user/0/com.example.myapplication/files/avatar/目录
//路径为avatarPath
之后就可以在 avatarPath 进行文件的创建和存放了。
2.外部存储(External Storage)
首先有个概念,外部存储到底在哪里?
手机自身存储空间如 64G 128G 256G 等属于外部存储,外部插入的 SD 卡也属于外部存储。
/storage/emulated/0 为机身存储的外部存储路径,如下图
/storage/0B04-2318 为 SD 卡路径,如上图
其次,外部存储一般分为两类,**==外部公有和外部私有 ==**外部存储的地址都一样,都是上图
外部公有
特点: 卸载应用时数据不会被删除
存储时需要用户权限
可以被其他应用访问
公共目录必须需要用户授权读写的权限,这意味着我们需要在 AndroidManifest.xml 中注册用户权限。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
并且在 Android 6.0 系统之后需要申请用户权限,并获得用户授权,才能读写文件。
我没有使用外部存储,但若要使用,需要在运行时动态申请请求权限,需要自己写一个方法来处理权限
相关 API
Environment.getExternalStorageDirectory()
地址/storage/emulated/0
Environment.getExternalStoragePublicDirectory(String type) Environment.getExternalStoragePublicDirectory(DIRECTORY_DOCUMENTS).getAbsolutePath()
地址/storage/emulated/0/Documents
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getAbsolutePath() 地址/storage/emulated/0/Music
外部私有
特点: 卸载时应用数据会被删除
存储时不需要用户权限
不能被其他应用访问
这就比较好了,一来数据存储在外部,二来不需要申请权限,三来不会被其他应用影响
相关 API 如下:
getExternalCacheDir().getAbsolutePath()
地址为/storage/emulated/0/Android/data/com.example.myapplication/cache
getExternalFilesDir("mytest").getAbsolutePath()
地址为/storage/emulated/0/Android/data/com.example.myapplication/files/mytest getExternalFilesDir(null).getAbsolutePath()
地址为/storage/emulated/0/Android/data/com.example.myapplication/files