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

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();
    }
}

我改了这些关键地方

  1. 用ContentResolver读取Content Uri:getContentResolver().openInputStream(wskaznik)是Android访问Content Uri资源的标准方式,不管文件存在本地还是云端(比如Google Drive)都能正常读取。
  2. 用try-with-resources语法:自动帮你关闭输入流和BufferedReader,不用手动写close(),避免资源泄漏,代码更安全。
  3. 去掉了错误的File对象:再也不用把Uri转成File了,因为Content Uri根本不是本地文件路径。
  4. 增加了Uri为空判断:防止空指针异常,让代码更健壮。

这样改完之后,你通过Intent选择的文本文件就能正常读取并填充到对应的TextView里了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:44:19