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

Android:使用ACTION_CREATE_DOCUMENT创建文件后写入失败求助

问题解决思路

你遇到的FileNotFound异常核心原因是:ACTION_CREATE_DOCUMENT返回的Uri是内容Uri(格式通常为content://...),而非文件系统的绝对路径。调用fileUri.getPath()拿到的是内容提供者内部的标识路径,不是真实的文件存储路径,因此FileWriter无法找到对应文件。

正确解决方案:通过ContentResolver操作输出流

对于内容Uri,必须使用ContentResolver打开输出流来写入数据,而非直接操作文件路径。以下是适配后的代码:

修改后的onActivityResult代码

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
        case PICKFILE_RESULT_CODE:
            if (resultCode == RESULT_OK && data != null) {
                Uri fileUri = data.getData();
                if (fileUri == null) break;

                // 使用try-with-resources自动关闭流,避免资源泄漏
                try (OutputStream outputStream = getContentResolver().openOutputStream(fileUri);
                     OutputStreamWriter writer = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8);
                     CSVWriter csvWrite = new CSVWriter(writer)) {

                    // 写入CSV数据示例
                    String[] header = {"列1", "列2", "列3"};
                    csvWrite.writeNext(header);
                    csvWrite.writeNext(new String[]{"数据1", "数据2", "数据3"});
                    // 写入更多数据行...

                } catch (IOException e) {
                    e.printStackTrace();
                    Toast.makeText(this, "CSV保存失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
                }
            }
            break;
    }
}

关键注意点

  • 直接使用返回的Uri对象,不要调用getPath()获取路径。
  • Android 10及以上强制采用分区存储,禁止直接访问外部存储的绝对路径,ContentResolver是操作这类文件的标准方式。
  • 用try-with-resources语法可以自动关闭流,避免手动关闭时出现的资源泄漏问题。

内容的提问来源于stack exchange,提问作者oldgit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 02:55:33