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

多文件读取至多个ArrayList异常:所有文件内容存入单列表

问题分析与修复方案

嘿,我来帮你定位代码里的问题!你的核心问题出在没有为每个文件创建对应的子ArrayList并添加到外层的data集合中,另外还有一些小细节可以优化,下面逐步拆解:

核心错误点

  1. 外层集合未初始化子列表:你初始化了ArrayList<ArrayList<String>> data,但这个集合一开始是空的,没有任何子ArrayList。当你在第二个for循环里调用data.get(j).add(s)时,会直接抛出IndexOutOfBoundsException(如果没报错,可能是你实际运行的代码有临时修改,但逻辑上这是致命问题)。这也是为什么你会出现“所有内容存入同一个列表”的原因——如果侥幸没有报错,大概率是你之前误将同一个子列表重复添加到了data里。
  2. 路径拼接不够规范:手动用file+"/"+files[i]拼接路径可能会因为系统分隔符差异出问题,建议用Java的File构造方法来处理。
  3. 跳过第一行的逻辑:代码里的reader.readLine()会跳过每个文件的第一行,如果这不是你的业务需求,记得删掉这行。

修正后的代码

public ArrayList<ArrayList<String>> readFromFile() throws IOException {
    ArrayList<ArrayList<String>> data = new ArrayList<ArrayList<String>>();
    String s = null;
    File directory = new File("/home/abed/Downloads/practical_database_java-StudentVers/practical_database_java/Database/Oracle");
    String[] files = directory.list();
    
    // 先做非空判断,避免目录为空或无法读取时出现空指针
    if (files == null || files.length == 0) {
        return data;
    }

    for (int j = 0; j < files.length; j++) {
        // 用File构造方法规范拼接路径
        File currentFile = new File(directory, files[j]);
        // 为当前文件创建一个新的子ArrayList,并添加到外层集合
        ArrayList<String> fileContent = new ArrayList<>();
        data.add(fileContent);
        
        try (BufferedReader reader = new BufferedReader(new FileReader(currentFile))) {
            // 如果不需要跳过第一行,就删掉下面这行
            reader.readLine();
            
            while ((s = reader.readLine()) != null) {
                fileContent.add(s);
            }
        }
    }
    return data;
}

关键改动说明

  • 新增了目录文件列表的非空判断,避免空指针异常。
  • 每次处理文件前,创建新的ArrayList<String>并添加到data中,确保每个文件对应独立的子列表。
  • 用new File(directory, files[j])来生成文件路径,更安全跨平台。
  • 直接操作刚创建的子列表fileContent,避免调用data.get(j)可能带来的索引问题。

这样修改后,每个文件的内容都会存入对应的独立ArrayList,while循环也会正常遍历每个文件的所有行啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:51:38