
在java中进行文件内容处理是常见的任务。filestats类旨在提供一个封装,使其能够方便地统计文件的总行数,以及查找包含特定文本的行数。该类通过管理文件路径,并提供相应的方法来实现这些功能。
类结构定义:
getNumLines() 方法的实现相对直接,它通过创建一个File对象,然后使用Scanner逐行读取文件并计数。
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 {
// 使用try-with-resources确保Scanner资源自动关闭
try (Scanner inputFile = new Scanner(new File(filename))) {
int numLines = 0;
while (inputFile.hasNextLine()) { // 检查是否有下一行
inputFile.nextLine(); // 读取并丢弃该行
numLines++;
}
return numLines;
}
}
// ... 其他方法 ...
}关键点:
getNumLinesThatContain() 方法的目标是查找文件中包含特定子字符串的行,且不区分大小写。这个方法是原问题中出现错误的地方。
立即学习“Java免费学习笔记(深入)”;
原代码中getNumLinesThatContain方法在初始化Scanner时犯了一个常见的错误:
// 错误示例: // inputFile = new Scanner(filename); // filename 是一个String
这里的错误在于,Scanner有一个构造函数 Scanner(String source),它会将传入的String参数本身作为要扫描的文本内容,而不是将其视为文件路径。例如,如果filename是"myFile.txt",那么new Scanner("myFile.txt")会尝试扫描字符串字面量"myFile.txt",而不是打开名为"myFile.txt"的文件。这导致Scanner很快就没有更多内容可读,从而使计数结果不正确(通常是0或1)。
要解决这个问题,Scanner必须使用一个File对象作为输入源,就像在getNumLines()方法中那样。此外,为了实现不区分大小写的查找,我们需要将行内容和搜索关键字都转换为相同的大小写(例如,都转换为大写或小写)再进行比较。
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;
}
// ... getNumLines() 方法 ...
/**
* 计算文件中包含指定文本(不区分大小写)的行数。
* 如果一行中包含多次指定文本,仍只算作一行。
* @param key 要查找的文本。
* @return 包含指定文本的行数。
* @throws FileNotFoundException 如果文件不存在。
*/
public int getNumLinesThatContain(String key) throws FileNotFoundException {
// 同样使用try-with-resources确保Scanner资源自动关闭
try (Scanner inputFile = new Scanner(new File(filename))) { // 核心修正:使用File对象
int numLines = 0;
// 将搜索关键字转换为大写,以便进行不区分大小写的比较
String searchKeyUpperCase = key.toUpperCase();
while (inputFile.hasNextLine()) {
String line = inputFile.nextLine();
// 将当前行内容转换为大写,然后检查是否包含搜索关键字
if (line.toUpperCase().contains(searchKeyUpperCase)) {
numLines++;
}
}
return numLines;
}
}
}关键修正和最佳实践:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
/**
* FileStats 类用于统计文件的行数和查找包含特定文本的行。
*/
public class FileStats {
private String filename;
/**
* 构造方法,初始化文件路径。
* @param filename 待处理文件的路径。
*/
public FileStats(String filename) {
this.filename = filename;
}
/**
* 计算文件的总行数。
*
* @return 文件的总行数。
* @throws FileNotFoundException 如果指定的文件不存在。
*/
public int getNumLines() throws FileNotFoundException {
// 使用try-with-resources确保Scanner资源自动关闭
try (Scanner inputFile = new Scanner(new File(filename))) {
int numLines = 0;
while (inputFile.hasNextLine()) {
inputFile.nextLine(); // 读取并丢弃该行
numLines++;
}
return numLines;
}
}
/**
* 计算文件中包含指定文本(不区分大小写)的行数。
* 如果一行中包含多次指定文本,仍只算作一行。
*
* @param key 要查找的文本。
* @return 包含指定文本的行数。
* @throws FileNotFoundException 如果指定的文件不存在。
*/
public int getNumLinesThatContain(String key) throws FileNotFoundException {
// 同样使用try-with-resources确保Scanner资源自动关闭
try (Scanner inputFile = new Scanner(new File(filename))) { // 关键修正:使用File对象
int numLines = 0;
// 将搜索关键字转换为大写,以便进行不区分大小写的比较
String searchKeyUpperCase = key.toUpperCase();
while (inputFile.hasNextLine()) {
String line = inputFile.nextLine();
// 将当前行内容转换为大写,然后检查是否包含搜索关键字
if (line.toUpperCase().contains(searchKeyUpperCase)) {
numLines++;
}
}
return numLines;
}
}
/**
* 主方法,用于测试 FileStats 类。
* 需要在项目根目录下创建一个名为 "test.txt" 的文件。
* 例如:
* Hello World
* java programming
* Java is fun
* hello again
*/
public static void main(String[] args) {
String filePath = "test.txt"; // 确保此文件存在于项目根目录或提供完整路径
FileStats stats = new FileStats(filePath);
try {
// 示例:获取总行数
int totalLines = stats.getNumLines();
System.out.println("文件总行数: " + totalLines);
// 示例:查找包含 "java" 的行数 (不区分大小写)
int linesWithJava = stats.getNumLinesThatContain("java");
System.out.println("包含 'java' 的行数: " + linesWithJava);
// 示例:查找包含 "hello" 的行数 (不区分大小写)
int linesWithHello = stats.getNumLinesThatContain("hello");
System.out.println("包含 'hello' 的行数: " + linesWithHello);
// 示例:查找不存在的文本
int linesWithXYZ = stats.getNumLinesThatContain("xyz");
System.out.println("包含 'xyz' 的行数: " + linesWithXYZ);
} catch (FileNotFoundException e) {
System.err.println("错误:文件未找到 - " + filePath);
System.err.println("请确保文件存在且路径正确。");
} catch (Exception e) {
System.err.println("发生未知错误: " + e.getMessage());
e.printStackTrace();
}
}
}以上就是Java文件内容统计与字符串查找:Scanner使用陷阱与最佳实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号