Android应用指定文本文件可读取,自选文本文件读取失败求助
搞定你的Android文件读取问题!
我一眼就看出问题所在了——你在处理通过Intent选择的文件时,把Content Uri当成了本地文件路径来用,这在Android里绝对行不通!
你看哦,当你用ACTION_OPEN_DOCUMENT选择文件时,系统返回的是content://开头的Uri,这不是直接的文件系统路径,而是Content Provider提供的资源入口。你之前用FileReader去读这个Uri对应的"文件",当然会报文件不存在,因为这个Uri根本不是本地文件的路径啊!而你固定路径能成功,是因为那是真实的本地文件系统路径,FileReader能直接访问。
先说说你代码里的致命错误
- 直接把Uri转成
File:File plik = new File(String.valueOf(wskaznik));——content://...这种字符串不是合法的文件路径,所以这个File对象根本指向不存在的文件。 - 用
FileReader读取Content Uri:FileReader只能读本地文件系统的文件,碰Content Uri就歇菜。
正确的做法:用ContentResolver获取输入流
其实你处理图片的时候已经做对了!就是用getContentResolver().openInputStream(uri)来获取输入流,然后用这个流来读取文件内容。我给你改好了reqLoad分支的代码:
if (reqCode == reqLoad) { if (resCode == RESULT_OK) { Uri wskaznik = data.getData(); if (wskaznik == null) { Toast.makeText(getApplicationContext(), "Nie udało się pobrać pliku", LENGTH_SHORT).show(); return; } edytuj.setText(wskaznik.toString()); StringBuilder string = new StringBuilder(); // 用try-with-resources自动关闭流,避免泄漏 try (InputStream inputStream = getContentResolver().openInputStream(wskaznik); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { String linia; int licz = 0; while ((linia = reader.readLine()) != null) { switch (licz) { case 0: i_e_magazyn.setText(linia); string.append(linia).append('\n'); break; case 1: i_e_strefa.setText(linia); string.append(linia).append('\n'); break; case 2: i_e_rzad.setText(linia); string.append(linia).append('\n'); break; case 3: i_e_rama.setText(linia); string.append(linia).append('\n'); break; case 4: i_e_slup.setText(linia); string.append(linia).append('\n'); break; case 5: i_e_uszk.setText(linia); string.append(linia).append('\n'); break; case 6: i_e_w_uszk.setText(linia); string.append(linia).append('\n'); break; case 7: i_e_lok.setText(linia); string.append(linia).append('\n'); break; case 8: i_e_klasa.setText(linia); string.append(linia).append('\n'); break; case 9: i_e_dal_dzial.setText(linia); string.append(linia).append('\n'); break; case 10: i_e_pot_elem.setText(linia); string.append(linia).append('\n'); break; case 11: i_e_typ.setText(linia); string.append(linia).append('\n'); break; case 12: i_e_ilosc.setText(linia); string.append(linia).append('\n'); break; case 13: wczytaj.setText(linia); string.append(linia).append('\n'); break; } licz++; } } catch (FileNotFoundException e) { Toast.makeText(getApplicationContext(), "Nie ma takiego pliku", LENGTH_SHORT).show(); e.printStackTrace(); } catch (IOException e) { Toast.makeText(getApplicationContext(), "Nie zczytano pliku", LENGTH_SHORT).show(); e.printStackTrace(); } } else { Toast.makeText(getApplicationContext(), "Nie wybrałeś pliku", LENGTH_SHORT).show(); } }
我改了这些关键地方
- 用ContentResolver读取Content Uri:
getContentResolver().openInputStream(wskaznik)是Android访问Content Uri资源的标准方式,不管文件存在本地还是云端(比如Google Drive)都能正常读取。 - 用try-with-resources语法:自动帮你关闭输入流和BufferedReader,不用手动写
close(),避免资源泄漏,代码更安全。 - 去掉了错误的File对象:再也不用把Uri转成File了,因为Content Uri根本不是本地文件路径。
- 增加了Uri为空判断:防止空指针异常,让代码更健壮。
这样改完之后,你通过Intent选择的文本文件就能正常读取并填充到对应的TextView里了!
内容的提问来源于stack exchange,提问作者Menalk
相关产品推荐
相关产品推荐

