计算字符串在文件中出现的次数

Count number of times string appears in a file

我正在尝试计算某个字符串在文本文件 (.txt) 中出现的次数,到目前为止,我让 FileReader 工作(它读取文件,我可以将文本输出到文件到控制台)。我想知道的是检查文本文件中是否存在字符串(由用户输入)。我到目前为止是这样的:

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

public class Assignment2 {

    String fileName = "test.txt";
    String line = null;
    int counter = 0;

    public String getUserInput() {
        String userInput;
        Scanner userInputScanner = new Scanner(System.in);
        userInput = userInputScanner.nextLine();
        return userInput;
    }

    public String returnUserInput() {
        String userInput = getUserInput();
        return userInput;
    }


    public void readFile() {        
        try {

            FileReader fileReader = new FileReader(fileName);
            BufferedReader bufferedReader = new BufferedReader(fileReader);

            while((line = bufferedReader.readLine()) != null) {
                while (line.indexOf(word, indexOfWord) != -1) {
                    indexOfWord += word.length();
                    counter += 1;
                }
            }
            bufferedReader.close();

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Assignment2 test = new Assignment2();
        test.readFile();
    }

}

发生的事情是我无法遍历文件,当我 运行 使用 for 循环的程序时,它卡住了(?),它只是保持 运行 没有错误, 但它什么都不做。

我知道我的问题是 for 循环 (line.length() 不起作用,因为缓冲的 reader 一次读取一行...我真正想要的是获取文件中的字符串数)。我在检查用户输入时也遇到了问题(我想忽略字母的大小写,但我不能用 .contains() 做到这一点,而且我想不出另一种方法来检查该行是否包含用户输入) .

此外,我的流程是否正确,或者我这样做的方式效率不高?我得查一个3000字的文档。

如果您想忽略大小写,请使用以下方法:

line.toLowerCase().contains(text.toLowerCase())

line 是您从文件中读取的行。
text 是用户输入的字符串,这就是您要查找的内容。
定义一个计数器变量来跟踪数字。

然后检查是否找到匹配项,如果找到则增加计数器。 我可以给你确切的代码,但那样你就学不会了。如果您遇到困难并且这不起作用,我可以进一步帮助您。

你的程序不是"stuck",它正在等待你进入"user input"(再次)。

你一直在循环中调用 returnUserInput(),它会调用 getUserInput(),它将等待你输入(另一个)字符串并按 Enter。


至于您的代码,请不要将 line 声明为字段。应该是局部变量。

要重复搜索一行中的文本,请不要使用 contains() 或循环搜索该行的每个字符。使用 indexOf(String str, int fromIndex).

更新

代码应该是这样的:

String word = returnUserInput();
this.counter = 0;
try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
    for (String line; (line = reader.readLine()) != null; ) {
        for (int i = 0; (i = line.indexOf(word, i)) != -1; i += word.length()) {
            this.counter++;
        }
    }
}