如何将documentFile复制到外部存储?FileUtils.copyFile仅支持普通文件怎么办?
DocumentFile复制到外部存储解决方案
问题根因
org.apache.commons.io.FileUtils.copyFile() 仅支持 java.io.File 类型的参数,而Android的DocumentFile是SAF(存储访问框架)提供的文件封装类,无法直接转换为普通File对象,因此原有方法不适用。
实现方案
你可以通过流拷贝的方式完成复制,具体步骤如下:
- 调用源
DocumentFile的getUri()方法获取文件Uri,通过当前上下文的ContentResolver打开文件输入流 - 为目标外部存储文件打开输出流:如果目标是普通File直接创建
FileOutputStream,如果目标也是DocumentFile,同样通过其Uri调用ContentResolver.openOutputStream()获取输出流 - 完成流的读写拷贝后主动释放资源
代码示例
Java 通用实现(兼容全API版本)
try { // 1. 打开源DocumentFile输入流 InputStream inputStream = getContentResolver().openInputStream(srcDocumentFile.getUri()); // 2. 创建目标外部存储文件输出流,这里示例存到应用专属外部目录,也可以换成你自己的目标路径 File targetFile = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "copy_target.file"); OutputStream outputStream = new FileOutputStream(targetFile); // 3. 流拷贝逻辑 byte[] buffer = new byte[8192]; int readLen; while ((readLen = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, readLen); } // 4. 释放资源 inputStream.close(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); // 自行处理异常逻辑 }
API 29+ 简化实现
如果你的应用最小适配版本为API 29,可以直接用系统自带的工具类完成拷贝,无需自己写缓冲逻辑:
try { InputStream inputStream = getContentResolver().openInputStream(srcDocumentFile.getUri()); File targetFile = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "copy_target.file"); OutputStream outputStream = new FileOutputStream(targetFile); // 直接调用系统工具类拷贝 android.os.FileUtils.copy(inputStream, outputStream); inputStream.close(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); }
注意事项
- 推荐使用try-with-resources语法管理流,无需手动关闭,可避免资源泄露
- 拷贝前可先调用
srcDocumentFile.exists()、srcDocumentFile.isFile()校验源文件有效性,减少异常情况 - 如果需要复制到公共外部存储目录,需要按Android版本适配对应的存储权限申请逻辑
内容的提问来源于stack exchange,提问作者Abdellah SAYOUL
相关产品推荐
相关产品推荐

