Java分割竖线分隔CSV文件时split方法触发数组越界如何解决?
问题分析
- 错误1:
split("|")使用不符合预期。Java中String.split()的入参是正则表达式,|是正则的特殊元字符,代表逻辑或,直接传入"|"会被解析为匹配空字符串,最终拆分结果是单个字符组成的数组,无法按竖线正确分割字段。 - 错误2:读取文件时向
file集合中额外添加了\n字符串,遍历集合时会遇到纯换行的行,该行拆分后的数组长度远小于预期,访问索引5时直接触发数组越界。
修复方案
- 读取文件时仅保留实际行数据,不要插入多余的
\n - 分割字符串时对
|做转义处理,写法为split("\\|")(第一个反斜杠是Java字符串转义,第二个反斜杠是正则语法转义,让|被识别为普通分隔符)
修复后的代码如下:
public List<EquivalenceGroupsTO> read() throws FileNotFoundException, IOException { try (BufferedReader br = new BufferedReader(new FileReader("/home/myself/Desk/blaBla/T60.csv"))) { List<String> file = new ArrayList<>(); String line = br.readLine(); Integer count = 0; // 未使用的变量可以删除,比如StringBuilder、HashSet while (line != null) { count++; file.add(line); line = br.readLine(); } List<EquivalenceGroupsTO> equivalenceGroupsTOs = new ArrayList<>(); for (String row : file) { EquivalenceGroupsTO equivalenceGroupsTO = new EquivalenceGroupsTO(); // 转义竖线作为分隔符 String[] str = row.split("\\|"); // 添加长度校验避免脏数据报错 if (str.length >= 8) { equivalenceGroupsTO.setEquivalenceGroupsCode(str[5]); equivalenceGroupsTO.setDescription(str[7]); equivalenceGroupsTO.setLastUpdateDate(new Date()); equivalenceGroupsTOs.add(equivalenceGroupsTO); System.out.println("Tutto ok!"); } else { System.out.println("异常行数据,字段不足:" + row); } } return equivalenceGroupsTOs; } }
补充说明
代码中未使用的StringBuilder、HashSet变量可以直接删除,减少不必要的内存占用。
内容的提问来源于stack exchange,提问作者mcA95
相关产品推荐
相关产品推荐

