Android Studio中Java读取文件遇No file or directory错误排查
Android读取本地配送员文件问题解决
一、解决文件找不到的问题
你遇到的"No file or directory"错误,根源在于模块根目录的sampledata文件夹不会被打包到APK中,运行时App无法通过本地文件路径访问到它。
正确的处理步骤:
- 在
app/src/main目录下创建assets文件夹(如果还没有)。 - 将
delivererList.txt移动到assets目录下。 - 使用Android提供的
AssetManager读取文件,而不是Java的File类——因为App运行在沙箱环境中,无法直接访问本地文件系统的路径。
二、修复读取逻辑的bug
你的原代码存在几个逻辑问题:
Scanner.next()会读取第一行的第一个元素(也就是"1"),之后nextLine()只能读取该行剩余的部分,导致分割后第一个元素是空字符串。- 只处理了第一行数据,没有遍历所有行筛选标记为1的配送员。
- 手动将List转数组的代码完全可以简化。
修复后的完整代码
import android.content.Context; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; public class DelivererHandler { private final Context context; public DelivererHandler(Context context) { this.context = context; } public String[] getAvailableDeliverer() { // 默认返回无可用配送员的数组 String[] noDeliverer = {"0", "NO", "DELIVERER", "AVAILABLE"}; List<String[]> availableList = new ArrayList<>(); try { // 从assets中打开文件流 InputStream inputStream = context.getAssets().open("delivererList.txt"); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String line; // 逐行读取文件内容 while ((line = reader.readLine()) != null) { String[] delivererInfo = line.split(","); // 校验数据格式,避免数组越界 if (delivererInfo.length >= 4 && "1".equals(delivererInfo[0])) { availableList.add(delivererInfo); } } // 关闭流 reader.close(); inputStream.close(); // 返回第一个可用配送员(如需返回所有,可修改为返回二维数组) if (!availableList.isEmpty()) { return availableList.get(0); } } catch (IOException e) { e.printStackTrace(); } return noDeliverer; } }
代码说明
- 必须传入
Context才能获取AssetManager,调用时直接从Activity/Fragment中传this即可。 - 使用
BufferedReader比Scanner更适合处理文本文件,效率更高。 - 增加了数据格式校验,避免因文件内容异常导致数组越界崩溃。
- 收集所有标记为1的配送员,你可以根据需求返回第一个,或者将
availableList转为二维数组返回所有结果。
调用示例(在Activity中)
DelivererHandler handler = new DelivererHandler(this); String[] availableDeliverer = handler.getAvailableDeliverer(); // 处理返回的配送员信息
内容的提问来源于stack exchange,提问作者Kyle Boan
相关产品推荐
相关产品推荐

