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

Android Studio中Java读取文件遇No file or directory错误排查

Android读取本地配送员文件问题解决

一、解决文件找不到的问题

你遇到的"No file or directory"错误,根源在于模块根目录的sampledata文件夹不会被打包到APK中,运行时App无法通过本地文件路径访问到它。

正确的处理步骤:

  1. 在app/src/main目录下创建assets文件夹(如果还没有)。
  2. 将delivererList.txt移动到assets目录下。
  3. 使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 11:42:04