Android内部存储中录音临时文件的复制与移动方法
Android 实现临时录音文件的复制/移动到指定目标文件
核心前提说明
因为你需要保留audioTempFile供后续录制使用,优先选择复制操作;如果后续不再需要临时文件,才考虑移动操作(移动会删除原临时文件)。另外,你使用的getFilesDir()属于应用私有存储目录,无需申请动态存储权限。
步骤1:确保目标目录存在
在复制/移动前,必须先检查并创建目标存储目录storeDir,否则会出现文件找不到的异常:
// Kotlin 代码 val rootDir = getFilesDir() val storeDir = File(rootDir, "MyStorageDirectory") if (!storeDir.exists()) { storeDir.mkdirs() // 递归创建多级目录 } val finalFile = File(storeDir, "MyFinalFileName")
// Java 代码 File rootDir = getFilesDir(); File storeDir = new File(rootDir, "MyStorageDirectory"); if (!storeDir.exists()) { storeDir.mkdirs(); } File finalFile = new File(storeDir, "MyFinalFileName");
步骤2:复制临时文件到目标文件
Kotlin 实现(使用IO流)
import java.io.FileInputStream import java.io.FileOutputStream fun copyTempFile(audioTempFile: File, finalFile: File) { try { FileInputStream(audioTempFile).use { inputStream -> FileOutputStream(finalFile).use { outputStream -> inputStream.copyTo(outputStream) } } // 复制成功后的逻辑,比如提示用户保存完成 } catch (e: Exception) { e.printStackTrace() // 处理复制失败的情况,比如弹窗提示用户 } } // 调用示例 copyTempFile(audioTempFile, finalFile)
Java 实现(使用IO流)
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public void copyTempFile(File audioTempFile, File finalFile) { FileInputStream inputStream = null; FileOutputStream outputStream = null; try { inputStream = new FileInputStream(audioTempFile); outputStream = new FileOutputStream(finalFile); byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) > 0) { outputStream.write(buffer, 0, length); } // 复制成功后的逻辑 } catch (IOException e) { e.printStackTrace(); // 处理失败逻辑 } finally { try { if (inputStream != null) inputStream.close(); if (outputStream != null) outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } // 调用示例 copyTempFile(audioTempFile, finalFile);
步骤3:移动临时文件到目标文件(可选,会删除原文件)
如果后续不需要保留临时录音文件,可以用移动操作,比复制更高效:
Kotlin 实现
fun moveTempFile(audioTempFile: File, finalFile: File) { try { val isSuccess = audioTempFile.renameTo(finalFile) if (isSuccess) { // 移动成功逻辑,比如清理临时文件相关的缓存 } else { // 移动失败,可能是目录不存在或文件被占用 } } catch (e: Exception) { e.printStackTrace() } } // 调用示例 moveTempFile(audioTempFile, finalFile)
Java 实现
public void moveTempFile(File audioTempFile, File finalFile) { try { boolean isSuccess = audioTempFile.renameTo(finalFile); if (isSuccess) { // 移动成功逻辑 } else { // 移动失败处理 } } catch (Exception e) { e.printStackTrace(); } } // 调用示例 moveTempFile(audioTempFile, finalFile);
注意:
renameTo()方法在跨存储分区时可能失效(比如从内部存储移动到SD卡),但你这里都是在应用私有目录内操作,所以可以正常使用。如果涉及跨分区移动,建议用复制+删除原文件的方式替代。
内容的提问来源于stack exchange,提问作者Michel
相关产品推荐
相关产品推荐

