Java文件处理:实现高效的行计数与关键词查找
技术百科
花韻仙語
发布时间:2025-07-13
浏览: 次 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)
统计文件的总行数是文件处理中的一个基本操作。其核心思想是逐行读取文件内容,并对读取到的每一行进行计数。
实现步骤:
- 创建一个 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 testFil
eName = "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
# 关键词
# 通常会
# 不存在
# 象中
# 创建一个
# 对象
# Java
# String
# 构造函数
# 字符串
# 封装
# try
# 抛出
# 行数
# 转换为
# 自动关闭
# 正确地
# scanner类
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- c# Task.ConfigureAwait(tr
- Win11怎么设置组合键快捷方式_Windows1
- Python正则表达式实战_模式匹配说明【教程】
- Win10如何更改网络连接_Windows10以太
- Go 中的 := 运算符:类型推导机制与使用边界详
- windows如何禁用驱动程序强制签名_windo
- Python集合操作技巧_高效去重解析【教程】
- 短链接怎么用php递归还原_多层加密链接的处理法【
- Win10电脑怎么设置休眠快捷键_Windows1
- C++如何使用std::async进行异步编程?(
- Mac如何将HEIC图片格式转为JPG_Mac批量
- C++中的std::shared_from_thi
- MAC怎么设置程序窗口永远最前_MAC窗口置顶插件
- Win11怎么关闭用户账户控制UAC_Window
- Python日志系统设计与实现_高可观测性架构实战
- Mac系统更新下载慢或失败怎么办_解决macOS升
- php8.4如何实现队列任务_php8.4redi
- Windows10系统怎么查看IP地址_Win10
- php打包exe怎么传递参数_命令行参数接收方法【
- Drupal 中 HTML 链接被重复转义导致渲染
- PhpStorm怎么调试PHP代码_PhpStor
- 如何解决同一段404代码在不同主机上表现不一致的问
- Windows家庭版如何开启组策略(gpedit.
- Win11如何关闭游戏模式 Win11禁用Xbox
- PythonDocker高级项目部署教程_多容器管
- php本地部署后session无法保存_sessi
- Windows电脑键盘突然失灵怎么办?(驱动与硬件
- 如何使用正则表达式提取以编号开头、后接多个注解的逻
- mac本地php环境如何开启curl_curl扩展
- Windows10系统怎么查看设备管理器_Win1
- Windows蓝屏BAD_POOL_HEADER故
- Win11如何开启telnet服务 Win11启用
- Mac如何整理桌面文件_Mac使用堆栈功能一键整理
- 如何在 Go 中调用动态链接库(.so)中的函数
- Win11怎么开启窗口对齐助手_Windows11
- Win11怎么设置桌面图标间距_Windows11
- Python爬虫项目实战教程_Scrapy抓取与存
- Windows驱动无法加载错误解决方法_驱动签名验
- mac怎么看硬盘大小_MAC查看磁盘存储空间与文件
- LINUX如何开放防火墙端口_Linux fire
- c++ stringstream用法详解_c++字
- win11 OneDrive怎么彻底关闭 Win1
- C++ static_cast和dynamic_c
- Win11 C盘满了怎么清理 Win11磁盘清理和
- Win11怎么关闭自动修复_跳过Win11开机自动
- Win11怎么设置虚拟内存最佳大小_Windows
- Go 语言标准库为何不提供泛型 Contains
- 如何使用Golang实现错误包装与传递_Golan
- LINUX怎么进行文本内容搜索_Linux gre
- Win10怎样卸载iTunes_Win10卸载iT

eName = "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' 的行数: "
QQ客服