Java实现:逐行匹配两文本文件内容并输出匹配行至第三文件
问题解决思路与修正代码
你的判断完全正确,原代码的核心问题就是scanB读完B.txt后就到了文件末尾,没法重新读取,所以只能处理A.txt的第一行。另外代码里还有一些变量名错误和资源管理的问题,下面给你修正后的实现方案:
原代码的主要问题
scanB仅能遍历B.txt一次,后续循环无法重新定位到文件开头- 变量名错误:比如
personB未定义、scaninteractionevents应该是scanB、personCheck未赋值,实际应该用读取到的personA - 每次匹配都创建新的文件写入流,不仅效率低,还容易因为未关闭流导致内容无法正常写入
优化后的实现方案
先把B.txt里的所有名字加载到一个集合中,之后遍历A.txt每行时,直接用集合判断该行是否包含目标名字,这样既高效又避免重复读取文件。同时用try-with-resources自动管理流资源,避免手动关闭的遗漏。
import java.io.File; import java.io.FileWriter; import java.io.BufferedWriter; import java.io.IOException; import java.util.HashSet; import java.util.Scanner; public class PersonFilter { public static void main(String[] args) { // 1. 加载B.txt中的所有名字到集合 HashSet<String> targetNames = new HashSet<>(); File fileB = new File("B.txt"); try (Scanner scanB = new Scanner(fileB)) { while (scanB.hasNextLine()) { String name = scanB.nextLine().trim(); // 去除首尾空白字符 if (!name.isEmpty()) { targetNames.add(name); } } } catch (IOException e) { System.err.println("读取B.txt时出错: " + e.getMessage()); return; } // 2. 遍历A.txt,筛选符合条件的行并写入结果文件 File fileA = new File("A.txt"); File resultFile = new File("PersonList.txt"); try (Scanner scanA = new Scanner(fileA); BufferedWriter writer = new BufferedWriter(new FileWriter(resultFile))) { while (scanA.hasNextLine()) { String line = scanA.nextLine(); boolean containsTarget = false; // 检查当前行是否包含集合中的任意名字 for (String name : targetNames) { if (line.contains(name)) { containsTarget = true; break; } } if (containsTarget) { writer.write(line); writer.newLine(); // 写入换行符,保持原文件格式 } } System.out.println("筛选完成,结果已写入PersonList.txt"); } catch (IOException e) { System.err.println("文件操作出错: " + e.getMessage()); } } }
代码说明
- 集合存储目标名字:用
HashSet存储B.txt的名字,对于小文件来说遍历匹配足够高效;如果B.txt内容很大,也可以基于集合的快速查找特性做优化。 - try-with-resources:自动关闭
Scanner和BufferedWriter,无需手动调用close(),彻底避免资源泄漏。 - 空白处理:读取B.txt名字时去除首尾空白,避免因为换行或空格导致匹配失败。
- 错误处理:捕获IO异常并给出明确提示,方便排查文件路径、权限类问题。
内容的提问来源于stack exchange,提问作者DankFrank
相关产品推荐
相关产品推荐

