如何在Java中逐行扫描文件A,并对每一行在文件B中进行全文匹配

胖宇同学_1169

胖宇同学_1169

2025-12-30

297人浏览

原创

如何在Java中逐行扫描文件A,并对每一行在文件B中进行全文匹配

本文讲解如何用java实现:读取文件a的每一行,然后在文件b的全部内容中查找该行是否包含任意一个b中的名字;若匹配成功,则将该行写入结果文件。核心在于避免scanner无法重置的问题,通过循环内重建scanner实现重复读取。

在Java中,Scanner 是单向流式读取器,一旦读到文件末尾(hasNextLine() 返回 false),它无法自动回退到开头——这正是原代码逻辑失效的根本原因。因此,要让“每行A都完整比对整个B”,必须确保每次进入内层循环时,都能从B文件起始位置重新扫描。最直接、清晰且适合初学者的解决方案是:在每次外层循环迭代中,新建一个 Scanner 实例来读取文件B。

以下是优化后的完整实现(含资源管理与健壮性改进):

import java.io.*;
import java.util.Scanner;

public class NameMatcher {
    public static void main(String[] args) {
        File fileA = new File("A.txt");
        File fileB = new File("B.txt");
        File outputFile = new File("PersonList.txt");

        try (Scanner scanA = new Scanner(fileA)) {
            // 逐行读取A.txt
            while (scanA.hasNextLine()) {
                String lineFromA = scanA.nextLine().trim();
                if (lineFromA.isEmpty()) continue;

                // 每次都新建Scanner,确保从B文件开头重新扫描
                try (Scanner scanB = new Scanner(fileB)) {
                    boolean matched = false;
                    while (scanB.hasNextLine()) {
                        String nameInB = scanB.nextLine().trim();
                        if (nameInB.isEmpty()) continue;
                        // 判断lineFromA是否包含nameInB(全名精确匹配,不区分大小写)
                        if (lineFromA.toLowerCase().contains(nameInB.toLowerCase())) {
                            matched = true;
                            break; // 找到一个即跳出,避免重复写入同一行
                        }
                    }

                    // 匹配成功则追加写入结果文件
                    if (matched) {
                        try (FileWriter fw = new FileWriter(outputFile, true);
                             BufferedWriter bw = new BufferedWriter(fw);
                             PrintWriter writer = new PrintWriter(bw)) {
                            writer.println(lineFromA); // 使用println确保换行
                        }
                    }
                }
            }
        } catch (FileNotFoundException e) {
            System.err.println("错误:找不到输入文件 — " + e.getMessage());
        } catch (IOException e) {
            System.err.println("I/O错误 — " + e.getMessage());
        }
    }
}

✅ 关键改进说明:

java-api-doc-generator
java-api-doc-generator

分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。

下载
  • 使用 try-with-resources 自动关闭所有 Scanner、FileWriter、BufferedWriter 和 PrintWriter,彻底避免资源泄漏(无需手动调用 .close());
  • 对每行做 .trim() 处理,消除首尾空格干扰;跳过空行,提升鲁棒性;
  • 添加 matched 标志位,防止同一行因多次匹配而重复写入;
  • 使用 println() 而非 print(),确保输出文件每条记录独占一行;
  • 错误处理覆盖常见异常(FileNotFoundException、IOException),便于调试。

⚠️ 注意事项:

  • 当前逻辑是「A中某行 包含 B中某名字」(子串匹配)。如需精确单词匹配(例如避免 "Anna" 匹配 "Annabelle"),建议将B中名字存入 Set,再对A中每行按空格/分隔符切分后逐词比对;
  • 若B文件极大(如百万行),频繁重建Scanner并重读磁盘会显著降低性能——此时应改用「预加载B为内存集合」策略(如 Set namesInB = Files.readAllLines(Paths.get("B.txt")).stream().map(String::trim).filter(s -> !s.isEmpty()).collect(Collectors.toSet());),后续仅做O(1)哈希查找;
  • 文件编码未显式指定,默认使用系统平台编码。生产环境建议统一用 StandardCharsets.UTF_8 显式声明(如 new Scanner(fileB, "UTF-8"))。

掌握这种“外层驱动、内层重置”的模式,是处理多文件交叉扫描任务的基础范式。它简洁、可读性强,也完美契合初学者对流程控制的直观理解。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java stream java实现

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end='\n', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.27

3200

5

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

2026.02.03

269

24

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

6979

3

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

2025.09.05

670

5

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.16

343

7

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.17

533

20

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.27

303

6

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

2026.11.02

0

14

Uvicorn使用教程
Uvicorn使用教程

本专题汇总了Uvicorn使用教程与启动运行指南,涵盖其作为Python ASGI服务器的定位与特点,以及命令行启动(uvicorn main:app --reload)、参数配置(host/port/workers)、程序内嵌运行与Gunicorn结合部署等核心用法。同时整理了热重载调试、日志配置与生产环境部署优化等技巧,助你快速掌握Uvicorn的运行与配置。

2026.11.02

0

17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习