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

Android应用使用FileReader读取文件抛出FileNotFoundException问题求助

解决Android文件选择后FileNotFoundException问题

嘿,我一眼就瞅出问题所在了——你拿到的Uri路径根本不是真实的文件系统路径!看日志里的/document/primary:media/Data.txt就知道,这是Android DocumentProvider返回的虚拟路径,直接用FileReader去访问肯定找不到文件,系统不会把这个路径映射到真实的文件位置。

另外你的代码里还有两个小坑得补上:

  • bufferedReader初始化后新建了对象却没赋值,后面调用readLine()会直接触发空指针异常
  • 判断文件路径非空用了filePath != "",这种写法在Java里不靠谱,正确的应该是先判null再用!filePath.isEmpty()

下面是修正后的完整代码,我改用ContentResolver来打开文件输入流,这才是访问Uri指向文件的正确姿势:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch(requestCode) {
        case ACTIVITY_CHOOSE_FILE: {
            if (resultCode == RESULT_OK && data != null){
                Uri uri = data.getData();
                if (uri != null) {
                    txtvFileSelected.setText(uri.toString()); // 可以显示Uri而非无效的路径
                    try {
                        // 用ContentResolver打开输入流,替代FileReader
                        InputStream inputStream = getContentResolver().openInputStream(uri);
                        if (inputStream != null) {
                            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                            String line;
                            int currentLine = 0;
                            while((line = bufferedReader.readLine()) != null) {
                                System.out.println(line);
                                //TODO: add string separation into floats here.
                                currentLine++;
                            }
                            // 依次关闭流
                            bufferedReader.close();
                            inputStream.close();
                        }
                    } catch(FileNotFoundException ex) {
                        System.out.println("File not found: " + uri.toString());
                        ex.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                } else {
                    txtvFileSelected.setText("No file selected");
                }
            } else {
                txtvFileSelected.setText("No file selected");
            }
        }
        break;
        default:
            super.onActivityResult(requestCode, resultCode, data);
    }
}

关键修改点说明:

  • 用ContentResolver访问Uri:Android 4.4+之后,文件选择器返回的Uri是通过DocumentProvider提供的,必须用getContentResolver().openInputStream(uri)获取文件输入流,而非直接用路径创建FileReader
  • 修复BufferedReader初始化:原来的代码里bufferedReader = null; new BufferedReader(fileReader);没有把新建对象赋值给变量,导致后续调用readLine()空指针,现在直接初始化赋值
  • 完善空值判断:增加了data != null和uri != null的判断,避免空指针;同时去掉了错误的路径非空判断,因为现在我们直接使用Uri而非getPath()的无效结果

这样修改后,就能正常读取选中的txt文件内容啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:32:46