You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 10:36:00