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
相关产品推荐
相关产品推荐

