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

