IO 存储 Files
独享区(0为User ID) - /data/user/0/包名/,不会被文件管理器感知到。
公共区 - /storage/emulated/0/Android/data/包名/,其中 /storage/emulated/0/Download/、Documents/ 无需授权,且创建者卸载也会保留。配置了 android:hasFragileUserData=true 的应用卸载时, 会询问是否保存其公共区的数据。
U盘区 - /storage/UUID/;无权区 - /system/等。
存储:
常用目录 - getCacheDir()、getFilesDir()、公用目录 Environment.getExternalStorageDirectory() 即 /storage/emulated/0
拼接路径 - getCacheDir().toPath().resolve("x.txt").toFile();
文件路径传输首选通过 FileDescriptor。
临时写入文件:
try {
var path = getFilesDir().toPath().resolve("f.txt");
Files.write(path, "Content".getBytes()); // Android 未实现 Files.writeString(...);
} catch (IOException e) { }
// 或 追加内容:
try (var fos = new FileOutputStream(File.createTempFile("x".repeat(3), ".txt",
new File(System.getProperty("java.io.tmpdir")))); // 即 getCacheDir(),不提供则由系统决定。
var ch = fos.getChannel()) { // 取代 InputStream/OutputStream;返回写入字节数。
ch.write(ByteBuffer.wrap("Hi".getBytes()));
} catch (IOException e) { }
通过 Environment.DIRECTORY_PICTURES 可获取用户更改的默认图片存储位置,实际路径通常是: /storage/emulated/0/Pictures/;但应首选非写死的 ContentUri。
contentValues.put(MediaStore.Images.ImageColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES); // 指定约定目录或子目录;或 put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/subDir")