
本文详解如何正确读取逗号分隔的文本文件内容,将其拆分为字符串数组(或列表),并避免因索引越界导致的 `indexoutofboundsexception`,提供简洁、健壮且符合现代 java 最佳实践的解决方案。
原始代码存在多个关键问题:
- 错误使用 add(index, element):TexttoList.add(d, scanText.next()) 试图在指定索引插入元素,但列表初始为空,首次调用 add(0, ...) 成功,而 add(1, ...) 会因当前 size=1 导致 IndexOutOfBoundsException(Java 要求插入索引 ≤ size);
- 循环嵌套逻辑混乱:外层 while(scanText.hasNext()) 与内层 for(int d = 0; d
- 未校验索引有效性:直接调用 TexttoList.get(3),而实际只成功添加了 1 个元素,必然越界。
✅ 推荐方案:使用 Java NIO 的 Files.readString() + String.split()(JDK 11+)
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
public class TextFileToList {
public static void main(String[] args) {
try {
// 1. 一次性读取整个文件为字符串(自动使用 UTF-8 编码)
String content = Files.readString(Paths.get("myTEXT.txt"));
// 2. 按逗号及可选空格分割,得到字符串数组
String[] parts = content.trim().split(",\\s*");
// 3. 转换为不可变列表(便于调试和后续操作)
List textList = Arrays.asList(parts);
// ✅ 安全访问:先检查长度再取值
if (textList.size() > 3) {
System.out.println("第4个元素(索引3): " + textList.get(3)); // 输出: COMMING
} else {
System.out.println("警告:列表长度不足4,无法访问索引3");
}
// 打印全部元素验证
System.out.println("完整列表: " + textList);
// 输出: [PETTY MIND, 2023, IS, COMMING]
} catch (IOException e) {
System.err.println("读取文件失败: " + e.getMessage());
}
}
} ? 关键说明:
- ",\\s*" 正则确保能匹配 , 后跟任意数量空格(如 "COMMING " 也能正确分割);
- content.trim() 防止首尾空白符干扰分割结果;
- 使用 Arrays.asList() 得到固定大小列表,若需可变列表可改为 new ArrayList(Arrays.asList(parts));
- 务必校验索引边界 —— 这是避免 IndexOutOfBoundsException 的根本原则,而非依赖“数据一定存在”。
⚠️ 注意事项:
- 若需兼容 JDK 8 或更低版本,请改用 Files.readAllLines() + String.join() 或 BufferedReader;
- 大文件不建议用 readString()(内存占用高),应采用流式逐行处理;
- 生产环境建议添加异常分类处理(如 NoSuchFileException 单独捕获)。
此方法简洁、高效、可读性强,彻底规避了 Scanner 分词状态管理的复杂性,是处理结构化单行文本的首选实践。










