Java:基于List内容编辑文本文件无效果问题排查
问题描述
我有一个约25000行的文本文件,每行数据格式如下:
B38564108,EURONAV NV SHS, B38564908,EURONAV NV CALL, B38564958,EURONAV NV PUT, B6S7WD106,NYXOAH S A SHS,
同时我有一个ArrayList(命名为subStrings),其每个元素对应文件每行的子串,索引与行号一致,例如前4个元素为:
{"EURONAV NV","EURONAV NV","EURONAV NV","NYXOAH S A"}
我需要生成一个新文本文件,内容与原文件一致,但要将每行对应的子串后添加逗号,处理后示例行如下:
B38564108,EURONAV NV, SHS, B38564908,EURONAV NV, CALL, B38564958,EURONAV NV, PUT, B6S7WD106,NYXOAH S A, SHS,
当前实现逻辑是将原文件内容读取为String类型的List,尝试更新每个元素后写入新文件,代码如下:
File textFile = new File("new_doc.txt"); List<String> lines = FileUtils.readLines(originalTextFile, "UTF-8"); FileWriter fw = new FileWriter(textFile.getAbsoluteFile()); BufferedWriter bw = new BufferedWriter(fw); if (subStrings.size() == lines.size()) { for (int i = 0; i < lines.size(); i++) { String replacementText = subStrings.get(i).concat(","); lines.set(i,lines.get(i).replaceAll(subStrings.get(i), replacementText)); bw.write(lines.get(i) + System.getProperty("line.separator")); } bw.close(); }
目前新文件可正常生成,但内容与原文件完全一致,子串并未添加逗号,需要排查问题原因。
问题原因与解决方法
核心问题
你的代码使用了replaceAll方法,该方法的第一个参数是正则表达式而非普通字符串。即使子串看起来没有正则特殊字符,replaceAll也会将其当作正则解析,可能因隐性匹配规则导致替换失效。此外还有两种常见可能:
- 子串与原行对应内容存在细微差异(比如空格数量、大小写、不可见字符),导致匹配失败
- 文件编码不一致,读取的行内容与subStrings中的子串编码不匹配,无法被识别为相同内容
解决步骤
1. 替换replaceAll为replace
String.replace()是普通字符串替换,会直接匹配目标字符串并替换,不会处理正则元字符,更符合你的需求。修改替换逻辑:
// 原代码 lines.set(i,lines.get(i).replaceAll(subStrings.get(i), replacementText)); // 修改后 lines.set(i, lines.get(i).replace(subStrings.get(i), replacementText));
2. 验证子串与行内容的匹配性
在循环中加入调试代码,快速定位不匹配的行:
String line = lines.get(i); String sub = subStrings.get(i); if (!line.contains(sub)) { System.err.println("行" + (i+1) + "未找到子串:'" + sub + "',行内容:" + line); }
通过输出可以确认是否存在子串与行内容不一致的情况,比如空格多/少、大小写错误等。
3. 确保编码一致性
确认原文件的编码格式,如果不是UTF-8,调整FileUtils.readLines的编码参数(比如改成GBK或文件实际使用的编码),避免读取时出现乱码或不可见字符导致匹配失败。
优化后的完整代码
File textFile = new File("new_doc.txt"); List<String> lines = FileUtils.readLines(originalTextFile, "UTF-8"); // 使用try-with-resources自动关闭流,避免资源泄漏 try (BufferedWriter bw = new BufferedWriter(new FileWriter(textFile.getAbsoluteFile()))) { if (subStrings.size() == lines.size()) { for (int i = 0; i < lines.size(); i++) { String line = lines.get(i); String sub = subStrings.get(i); // 调试用,排查不匹配的行 if (!line.contains(sub)) { System.err.println("警告:行" + (i+1) + "未找到子串 '" + sub + "',内容为:" + line); bw.write(line + System.lineSeparator()); continue; } String replacementText = sub + ","; String newLine = line.replace(sub, replacementText); bw.write(newLine + System.lineSeparator()); } } } catch (IOException e) { e.printStackTrace(); }
内容的提问来源于stack exchange,提问作者Andrew Fox
相关产品推荐
相关产品推荐

