0

0

Java文件处理:实现高效的行计数与关键词查找

花韻仙語

花韻仙語

发布时间:2025-07-13 22:44:01

|

407人浏览过

|

来源于php中文网

原创

java文件处理:实现高效的行计数与关键词查找

本文详细介绍了如何在Java中设计一个FileStats类,用于统计文件的总行数以及包含特定关键词(不区分大小写)的行数。教程着重讲解了文件读取的核心机制,特别是Scanner类的正确初始化与使用,纠正了将文件名字符串误用作输入源的常见错误,并提供了利用try-with-resources语句进行资源管理的代码示例,以提升程序的健壮性与可维护性。

1. FileStats 类设计与功能概述

在Java中进行文件处理时,通常会创建一个专门的类来封装相关的操作逻辑。FileStats 类旨在提供以下核心功能:

  • 统计指定文件的总行数。
  • 统计文件中包含特定文本(关键词)的行数,并且查找过程不区分大小写。

该类的基本结构包含一个用于存储文件路径的私有字段 filename,一个用于初始化该字段的构造方法,以及两个核心功能方法。

类骨架:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class FileStats {
    private String filename; // 存储文件路径

    /**
     * 构造方法,初始化FileStats对象,指定要处理的文件名。
     * @param f 文件路径字符串
     */
    public FileStats(String f) {
        this.filename = f;
    }

    // 后续方法将在此处添加
}

2. 实现文件总行数统计 (getNumLines)

统计文件的总行数是文件处理中的一个基本操作。其核心思想是逐行读取文件内容,并对读取到的每一行进行计数。

立即学习Java免费学习笔记(深入)”;

实现步骤:

  1. 创建一个 File 对象,它代表了文件系统中的一个具体文件。
  2. 使用 Scanner 类来读取这个 File 对象的内容。
  3. 通过 Scanner.hasNextLine() 方法判断文件是否还有下一行可读。
  4. 通过 Scanner.nextLine() 方法读取当前行内容,并递增行数计数器。
  5. 重要提示: 文件读取完成后,必须关闭 Scanner 资源以释放文件句柄,防止资源泄露。在Java 7及更高版本中,推荐使用 try-with-resources 语句来自动管理资源的关闭。

代码示例:

// ... FileStats class definition ...

    /**
     * 获取文件的总行数。
     * @return 文件的总行数
     * @throws FileNotFoundException 如果指定的文件不存在,则抛出此异常
     */
    public int getNumLines() throws FileNotFoundException {
        File fileObj = new File(filename); // 创建File对象
        int numLines = 0;
        // 使用try-with-resources确保Scanner自动关闭
        try (Scanner inputFile = new Scanner(fileObj)) {
            while (inputFile.hasNextLine()) { // 判断是否还有下一行
                inputFile.nextLine(); // 读取行内容,但不使用
                numLines++; // 计数
            }
        } // Scanner在此处自动关闭
        return numLines;
    }

// ...

3. 实现包含关键词的行数统计 (getNumLinesThatContain)

此方法旨在统计文件中包含特定关键词的行数。在实现过程中,一个非常常见的错误是 Scanner 的初始化方式,这直接影响了文件内容的正确读取。

核心问题与修正:Scanner 的正确初始化

码上飞
码上飞

码上飞(CodeFlying) 是一款AI自动化开发平台,通过自然语言描述即可自动生成完整应用程序。

下载

在文件处理中,一个常见的陷阱是将文件路径字符串直接传递给 Scanner 构造函数,例如:

// 错误示例:将字符串本身作为Scanner的输入源
Scanner inputFile = new Scanner(filename);

这种写法会导致 Scanner 将传入的字符串 filename(例如 "my_document.txt")本身作为要扫描的文本内容,而不是将其解释为文件路径并打开文件。因此,Scanner 会尝试从字符串字面量 "my_document.txt" 中读取数据,而不是从磁盘上的实际文件中读取,这通常会导致 hasNext() 或 hasNextLine() 立即返回 false,或者只处理该字符串本身的简短内容,从而无法正确读取文件。

正确的做法是,Scanner 必须从一个 File 对象中读取数据:

// 正确示例:从File对象中读取文件内容
File fileObj = new File(filename);
Scanner inputFile = new Scanner(fileObj);

这样,Scanner 才能正确地识别并打开指定路径的文件,并从中读取内容。

实现步骤:

  1. 同样,先创建一个 File 对象。
  2. 使用 Scanner 正确地读取 File 对象的内容。
  3. 逐行读取文件。
  4. 为了实现不区分大小写的查找,将当前读取的行内容和要查找的关键词都转换为大写(或小写)。
  5. 使用 String.contains() 方法检查转换后的行是否包含转换后的关键词。
  6. 如果包含,则递增计数器。
  7. 继续使用 try-with-resources 确保 Scanner 资源被正确关闭。

代码示例:

// ... FileStats class definition ...

    /**
     * 获取文件中包含特定关键词的行数(不区分大小写)。
     * @param key 要查找的关键词
     * @return 包含关键词的行数
     * @throws FileNotFoundException 如果指定的文件不存在,则抛出此异常
     */
    public int getNumLinesThatContain(String key) throws FileNotFoundException {
        File fileObj = new File(filename); // 创建File对象
        int numLines = 0;
        // 使用try-with-resources确保Scanner自动关闭
        try (Scanner inputFile = new Scanner(fileObj)) {
            // 将关键词提前转换为大写,避免在循环内部重复转换,提高性能
            String upperCaseKey = key.toUpperCase();
            while (inputFile.hasNextLine()) {
                String line = inputFile.nextLine();
                // 将行内容转换为大写后进行包含判断
                if (line.toUpperCase().contains(upperCaseKey)) {
                    numLines++;
                }
            }
        } // Scanner在此处自动关闭
        return numLines;
    }

// ...

4. 完整 FileStats 类示例与最佳实践

为了确保代码的健壮性和可维护性,我们强烈推荐在所有涉及文件I/O的操作中使用 try-with-resources 语句。这可以保证无论代码块是否正常执行完毕,或者是否发生异常,像 Scanner 这样的可关闭资源都能被自动且安全地关闭,从而有效避免资源泄露。

完整的 FileStats 类代码:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class FileStats {
    private String filename;

    public FileStats(String f) {
        this.filename = f;
    }

    /**
     * 获取文件的总行数。
     * @return 文件的总行数
     * @throws FileNotFoundException 如果指定的文件不存在
     */
    public int getNumLines() throws FileNotFoundException {
        File fileObj = new File(filename);
        int numLines = 0;
        try (Scanner inputFile = new Scanner(fileObj)) {
            while (inputFile.hasNextLine()) {
                inputFile.nextLine();
                numLines++;
            }
        }
        return numLines;
    }

    /**
     * 获取文件中包含特定关键词的行数(不区分大小写)。
     * @param key 要查找的关键词
     * @return 包含关键词的行数
     * @throws FileNotFoundException 如果指定的文件不存在
     */
    public int getNumLinesThatContain(String key) throws FileNotFoundException {
        File fileObj = new File(filename);
        int numLines = 0;
        try (Scanner inputFile = new Scanner(fileObj)) {
            String upperCaseKey = key.toUpperCase(); // 提前转换关键词为大写
            while (inputFile.hasNextLine()) {
                String line = inputFile.nextLine();
                if (line.toUpperCase().contains(upperCaseKey)) {
                    numLines++;
                }
            }
        }
        return numLines;
    }

    /**
     * 示例主方法,展示如何使用FileStats类。
     * 请确保您的项目目录下有一个名为 "test.txt" 的文件,并包含一些文本内容。
     * 示例 test.txt 内容:
     * Hello World
     * hello java programming
     * JAVA is powerful
     * Programming is fun
     */
    public static void main(String[] args) {
        String testFileName = "test.txt"; // 假设存在此文件

        try {
            FileStats stats = new FileStats(testFileName);

            // 统计总行数
            int totalLines = stats.getNumLines();
            System.out.println("文件 '" + testFileName + "' 总行数: " + totalLines);

            // 统计包含 "java" 的行数(不区分大小写)
            int javaLines = stats.getNumLinesThatContain("java");
            System.out.println("包含 'java' 的行数: " + javaLines);

            // 统计包含 "World" 的行数
            int worldLines = stats.getNumLinesThatContain("World");
            System.out.println("包含 'World' 的行数: " + worldLines);

            // 统计包含 "nonexistent" 的行数
            int nonexistentLines = stats.getNumLinesThatContain("nonexistent");
            System.out.println("包含 'nonexistent' 的行数: "

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

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

443

2023.08.02

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1501

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

624

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

613

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

588

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

171

2025.07.29

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

158

2026.01.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号