Android:如何将临时文件保存到指定磁盘路径?
你有两种实现方案,可根据业务场景选择:
方案1:直接写入目标路径(更推荐,无需临时文件中转)
你可以跳过创建临时文件的步骤,直接将CSV内容写入期望的目标路径,代码如下:
// 优先通过系统API获取应用专属文件目录,不要硬编码路径,适配不同设备 File targetDir = activity.getExternalFilesDir(null); File targetFile = new File(targetDir, "myfile.csv"); // 直接向目标文件写入CSV内容 FileWriter fw = new FileWriter(targetFile); CSVWriter writer = new CSVWriter(fw, ' '/* DEFAULT_SEPARATOR */, NO_QUOTE_CHARACTER, DEFAULT_ESCAPE_CHARACTER, DEFAULT_LINE_END); writer.writeNext(entries); writer.flush(); fw.getFD().sync(); // 确保数据完全落盘 writer.close();
说明:Android 10及以上系统对外部存储权限管控严格,activity.getExternalFilesDir()指向应用专属目录,不需要申请额外存储权限即可读写,兼容性远优于硬编码路径。如果必须使用你指定的硬编码路径,直接创建File targetFile = new File("/storage/emulated/0/Android/data/com.example.myproject/files/myfile.csv")即可。
方案2:将已有临时文件移动到目标路径
如果必须保留先写临时文件的逻辑,写完后直接移动文件即可,不需要重新写入流:
// 构造目标文件对象 File targetDir = activity.getExternalFilesDir(null); File targetFile = new File(targetDir, "myfile.csv"); // 执行移动逻辑 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // 高版本系统用系统API移动,可靠性更高 Files.move(myfile.toPath(), targetFile.toPath(), StandardCopyOption.REPLACE_EXISTING); } else { boolean moveSuccess = myfile.renameTo(targetFile); // 同分区下renameTo成功率高,跨分区失败时走文件复制逻辑 if (!moveSuccess) { FileInputStream fis = new FileInputStream(myfile); FileOutputStream fos = new FileOutputStream(targetFile); byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) > 0) { fos.write(buffer, 0, len); } fos.flush(); fos.getFD().sync(); fis.close(); fos.close(); // 复制完成后可删除临时文件释放空间 myfile.delete(); } }
你之前写的FileOutputStream fileOutput = new FileOutputStream(myfile)逻辑是打开已有的临时文件写入内容,无法修改文件本身的存储路径,修改存储路径的本质是把文件内容写入新路径的文件对象,或者直接移动原文件到新路径。
内容的提问来源于stack exchange,提问作者toto_tata
相关产品推荐
相关产品推荐

