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

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免费学习笔记(深入)”;

实现步骤:

创建一个 File 对象,它代表了文件系统中的一个具体文件。使用 Scanner 类来读取这个 File 对象的内容。通过 Scanner.hasNextLine() 方法判断文件是否还有下一行可读。通过 Scanner.nextLine() 方法读取当前行内容,并递增行数计数器。重要提示: 文件读取完成后,必须关闭 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 的正确初始化

在文件处理中,一个常见的陷阱是将文件路径字符串直接传递给 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 才能正确地识别并打开指定路径的文件,并从中读取内容。

实现步骤:

同样,先创建一个 File 对象。使用 Scanner 正确地读取 File 对象的内容。逐行读取文件。为了实现不区分大小写的查找,将当前读取的行内容和要查找的关键词都转换为大写(或小写)。使用 String.contains() 方法检查转换后的行是否包含转换后的关键词。如果包含,则递增计数器。继续使用 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' 的行数: "

以上就是Java文件处理:实现高效的行计数与关键词查找的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/133168.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
win7怎么用3T硬盘
上一篇 2025年11月29日 04:49:38
iPadMini分屏如何节省电量_iPadMini分屏续航优化建议
下一篇 2025年11月29日 04:51:29

相关推荐

  • 如何使用 Composer 解决 HTTP 请求问题:yiche/http 库的实用指南

    可以通过以下地址学习 composer:学习地址 在开发过程中,如何高效地处理 HTTP 请求一直是一个挑战。我在一个项目中需要频繁地向不同的 API 发送请求,同时还要记录这些请求的日志,以便于后续的调试和分析。尝试了几种方法后,我找到了 yiche/http 这个库,它不仅简化了 HTTP 请求…

    用户投稿 2026年9月1日
    000
  • Windows下使用VS2013编译使用SDL库

    Windows下使用VS2013编译使用SDL库Windows下使用VS2013编译使用SDL库Windows下使用VS2013编译使用SDL库Windows下使用VS2013编译使用SDL库

    simple directmedia layer(sdl)是一个跨平台开发库,旨在通过opengl和direct3d提供对音频、键盘、鼠标、操纵杆和图形硬件的低级访问。多种软件,如视频播放工具、仿真器和许多热门游戏(包括valve的获奖作品和humble bundle中的众多游戏)都依赖于它。 SD…

    2026年9月1日 用户投稿
    100
  • ROS1/2机器人之从命令调用到程序编写

    难度级别: 容易☞命令调用 困难☞程序编写 命令调用简单案例 ROS1: rosrun package-name executable-name ROS2: ros2 run package-name executable-name 比如启动键盘遥控turtlesim ROS1: 大多数 ROS1 …

    2026年9月1日
    000
  • 《猎魔人》第四季曝新剧照!选角遭粉丝集体吐槽

    《猎魔人》第四季曝新剧照!选角遭粉丝集体吐槽《猎魔人》第四季曝新剧照!选角遭粉丝集体吐槽《猎魔人》第四季曝新剧照!选角遭粉丝集体吐槽《猎魔人》第四季曝新剧照!选角遭粉丝集体吐槽

    Netflix《猎魔人》第四季最新剧照由Entertainment Weekly今日发布,引发广泛关注。本季将迎来关键转折:利亚姆·海姆斯沃斯正式接棒亨利·卡维尔,饰演主角杰洛特·里维亚。自换角消息公布后,观众热议不断,此次新剧照释出再度点燃粉丝讨论热潮。 此外,第四季将首度引入吸血鬼角色雷吉斯(R…

    2026年9月1日 用户投稿
    000
  • 孙富春教授亲自下场,具身物理底座「中科第五纪」完成种子轮,云集清华大学与中科院自动化所两大研发团队

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 近日,专注于具身智能的科技公司“中科第五纪”宣布完成卓源亚洲的种子轮融资。公司汇聚了清华大学孙富春教授机器人实验室和中国科学院自动化所的顶尖人才,致力于研发全球领先的具身物理底座和多模态端到端大…

    2026年9月1日
    000
  • 提升PHP服务开发效率:symfony/service-contracts库的应用

    可以通过一下地址学习composer:学习地址 在开发复杂的php项目时,确保不同服务之间的兼容性和可维护性是一个常见的挑战。我尝试过多种方法来解决这个问题,但效果都不尽如人意。直到我发现了symfony提供的service-contracts库,它提供了一套通用的服务抽象,能够显著提升开发效率和代…

    用户投稿 2026年9月1日
    200
  • 苹果代码库出现未发布音频产品 外媒:或为AirPods Pro3

    近日,苹果在其代码库中进行了更新,有外媒注意到新版代码库中出现了一个未发布音频产品的数字编号。根据信息来源以及相关设备的传闻,这款设备很可能正是即将推出的airpods pro 3。 苹果旗下的每一款AirPods和Beats耳机都有专属的蓝牙ID号,例如AirPods Pro 2的ID号是0x20…

    2026年9月1日
    100
  • 使用Composer解决依赖注入:PSR-11容器接口的应用

    可以通过一下地址学习composer:学习地址 在开发大型php项目时,依赖管理是一个常见但棘手的问题。最初,我尝试使用全局变量和手动注入依赖,但这不仅增加了代码的复杂度,还容易导致错误。最终,我通过使用psr-11容器接口,并借助composer的强大功能,成功解决了这个问题。 PSR-11(PH…

    用户投稿 2026年9月1日
    000
  • vivo X Fold 5明日发布!全球最轻和全球首款三防折叠

    6月25日19:00,vivo将正式召开vivo x fold 5新品发布会。根据cnmo掌握的消息,除了主打的vivo x fold 5——这款被誉为全球最轻折叠屏手机以及首款具备三防功能的折叠机型外,现场还将发布vivo tws air3 pro等新品。 vivo X Fold 5 从官方此前透…

    2026年9月1日
    000
  • 如何使用Composer快速搭建LaravelCMS:mki-labs/espresso的实战经验

    可以通过一下地址学习composer:学习地址 在开发一个新的 laravel 项目时,我常常面临一个挑战:如何快速搭建一个功能齐全的内容管理系统(cms)。我尝试过手动编写 cms,但发现这不仅耗时,还需要不断维护和更新。幸运的是,我发现了 mki-labs/espresso 这个 laravel…

    用户投稿 2026年9月1日
    000
  • DeepSeek高管发生变更,新增互联网信息服务

    深度求索公司近期工商信息发生重大变更,新增“互联网信息服务”业务,并调整了高级管理人员。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ (来源:天眼查) 根据天眼查数据显示,2月13日,深度求索(杭州深度求索人工智能基础技术研究有限公司,D…

    2026年9月1日
    000
  • 有效管理过时代码:使用SymfonyDeprecationContracts

    可以通过一下地址学习composer:学习地址 在软件开发中,管理过时代码是一个常见但又容易被忽视的问题。最近,我在维护一个项目时,遇到了一个棘手的情况:一些旧的代码在新版本中被标记为过时,导致程序在升级后出现功能失效。为了解决这个问题,我开始寻找一种有效的方法来管理这些过时代码,最终找到了symf…

    用户投稿 2026年9月1日
    000
  • PHP cURL查询Notion数据库:掌握正确的过滤条件构建方法

    本教程详细阐述了使用PHP cURL向Notion API查询数据库时,如何正确构建包含过滤条件的POST请求体。核心问题在于,过滤条件必须嵌套在请求载荷的filter键下,而非直接作为顶级属性。文章通过对比错误与正确的代码示例,指导开发者精确地筛选Notion数据库数据,避免获取冗余信息,从而提高…

    2026年9月1日
    100
  • AI搜索时代,慧科讯业“颗粒化GEO”重构流量壁垒

    AI搜索时代,慧科讯业“颗粒化GEO”重构流量壁垒AI搜索时代,慧科讯业“颗粒化GEO”重构流量壁垒AI搜索时代,慧科讯业“颗粒化GEO”重构流量壁垒AI搜索时代,慧科讯业“颗粒化GEO”重构流量壁垒

    在数字化时代的快速演进中,曾经称霸搜索领域的百度、谷歌等传统搜索引擎,如今正面临着前所未有的挑战,往昔的流量优势逐渐被新兴力量所瓦解。人工智能分析平台aitools.xyz数据显示,deepseek与chatgpt在2025年2月的月度新增访问量分别达到5.2亿次及5亿次,成为全球增长最快的人工智能…

    2026年9月1日 用户投稿
    200
  • Java大数据中如何快速精准匹配句子中的关键词?

    Java大数据环境下的快速精准关键词匹配 本文探讨如何在Java大数据环境下,高效地从包含20万到50万条记录的词库中,快速精准地匹配句子中的关键词。词库存储介质可以是列表、字典、Redis或数据库。 高效算法:基于前缀树的匹配 为了实现高效匹配,我们采用基于前缀树(Trie树)的算法。该算法将每个…

    2026年9月1日
    100
  • 北大彭宇新教授团队开源细粒度多模态大模型Finedefics

    北京大学彭宇新教授团队在细粒度多模态大模型领域取得突破性进展,其研究成果已被iclr 2025接收并开源。该团队研发的finedefics模型显著提升了多模态大模型的细粒度视觉识别能力,在六个权威数据集上的平均准确率达到76.84%,超越了现有模型。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜…

    2026年9月1日
    100
  • Java Collections.frequency方法如何统计频率

    Collections.frequency方法用于统计集合中某元素出现次数,接收集合和目标元素为参数,遍历集合通过equals()比较并返回匹配次数;适用于List等Collection类型,支持自定义对象(需重写equals),可统计null,但集合为null时抛异常,时间复杂度O(n),对Set…

    2026年9月1日
    300
  • 《敢达决战》新机体秘典模组第4形态登场!重塑中排机体战术定位

    《敢达决战》新机体秘典模组第4形态登场!重塑中排机体战术定位《敢达决战》新机体秘典模组第4形态登场!重塑中排机体战术定位《敢达决战》新机体秘典模组第4形态登场!重塑中排机体战术定位《敢达决战》新机体秘典模组第4形态登场!重塑中排机体战术定位

    当进入《敢达决战》看到秘典模组第4形态闪亮登场,老玩家们瞬间激情澎湃!这台源自《高达00p》外传的神秘机体,如今正式入驻游戏阵容。作为天人组织研发的第三世代机体,秘天使敢达原本以“战场观察者”身份存在,如今与gn典籍战机合体后,在游戏中被定义为中排核心输出。 最令人惊喜的是机体设计细节——新增的4个…

    2026年9月1日 用户投稿
    1100
  • CentOS 8 更新提示 appstream 错误

    在 centos 8 上进行更新时,如果遇到以下错误: Error: Failed to download metadata for repo appstream 完整的错误信息为: Error: Failed to download metadata for repo ‘appstream’: C…

    2026年9月1日
    100
  • Java编程难题:如何高效计算奇偶数乘积?

    江湖求救:求解奇偶数乘积 面临编程难题,求各位大神解救。给定一个任意整数 n,需要计算其值。具体规则如下: 当 n 为奇数时,计算 n (n-2) (n-4) … (n-n 1)。当 n 为偶数时,计算 n (n-2) (n-4) … (n-n 2)。 希望采用 java 语…

    用户投稿 2026年9月1日
    100

发表回复

登录后才能评论
关注微信