Android平台无法定位文件位置,无法用FileReader读取.txt题库数据
Android读取本地TXT文件定位问题解决方案
你当前代码的核心问题是Android应用的沙箱存储机制,直接使用相对路径"folder/filename.txt"无法指向正确的文件位置——Android的文件系统和普通Java程序不同,不同存储位置的访问逻辑完全不同。以下是针对不同场景的可行解决方案:
场景1:读取APK内置的固定题库(推荐)
如果你的题库是应用打包时就包含的静态内容,推荐将文件放在assets或res/raw目录,这两个目录的文件会随APK一起发布,访问方式如下:
方式A:使用assets目录
- 在项目
src/main下创建assets目录,将filename.txt放入其中(如需子文件夹,直接在assets下新建folder目录再放文件) - 替换代码为:
try { // 在Activity/Context中获取AssetManager实例 AssetManager assetManager = getAssets(); // 打开assets中的文件,子文件夹直接写路径如"folder/filename.txt" BufferedReader lect = new BufferedReader(new InputStreamReader(assetManager.open("filename.txt"))); String ligne; while ((ligne = lect.readLine()) != null) { System.out.println(ligne); } lect.close(); } catch (IOException e) { e.printStackTrace(); }
方式B:使用res/raw目录
- 在
res下创建raw目录,将filename.txt放入(注意文件名不能包含大写字母、空格或特殊字符) - 通过资源ID读取文件,代码替换为:
try { // R.raw.filename对应res/raw下的filename.txt文件 InputStream inputStream = getResources().openRawResource(R.raw.filename); BufferedReader lect = new BufferedReader(new InputStreamReader(inputStream)); String ligne; while ((ligne = lect.readLine()) != null) { System.out.println(ligne); } lect.close(); inputStream.close(); } catch (IOException e) { e.printStackTrace(); }
场景2:读取外部存储的可更新题库
如果你的题库需要动态更新或从外部导入,需使用Android的外部存储路径:
- 权限处理:
- Android 9及以下:在
AndroidManifest.xml添加权限<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>,并在运行时申请权限 - Android 10及以上:优先使用应用专属外部存储路径,无需额外权限
- Android 9及以下:在
- 代码示例(应用专属外部存储):
// 获取应用专属外部存储目录,路径类似/storage/emulated/0/Android/data/你的包名/files File externalFilesDir = getExternalFilesDir(null); // 拼接目标文件路径 File file = new File(externalFilesDir, "folder/filename.txt"); try { BufferedReader lect = new BufferedReader(new FileReader(file)); String ligne; while ((ligne = lect.readLine()) != null) { System.out.println(ligne); } lect.close(); } catch (IOException e) { e.printStackTrace(); }
关键提示
- 不要直接用
FileReader加相对路径:Android应用有沙箱隔离,默认路径指向应用私有沙箱根目录,若文件没放在此处必然找不到 assets和res/raw的文件属于APK的一部分,无法修改;需要可编辑的文件时,必须使用内部存储或外部存储
内容的提问来源于stack exchange,提问作者Enzo Tur
相关产品推荐
相关产品推荐

