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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:05:21