如何将文件传递到 Java Matcher?

How to pass a file into Java Matcher?

我有这个使用 Java Matcher

的简单方法
public int countWord(String word, File file) throws FileNotFoundException {

    String patternString = word;
    Pattern pattern = Pattern.compile(patternString);
    Matcher matcher = pattern.matcher(file);

    int count = 0;
    while (matcher.find()) {
        count++;
        System.out.println("found: " + count + " : "
                + matcher.start() + " - " + matcher.end());
    }
    return  count;
}

我的想法是传一个文件到指令中:

Matcher matcher = pattern.matcher(file);

但是 Java 抱怨它,即使我听从 IDE 的建议说要像这样进行转换:

java.util.regex.Matcher matcher = pattern.matcher((CharSequence) file);

事实上,当我尝试启动编译时,它会报告此消息:

Exception in thread "main" java.lang.ClassCastException: java.io.File cannot be cast to java.lang.CharSequence

我怎样才能越过这个障碍?

当然不能将File转为CharSequence,它们之间没有任何关系。

Pattern class 中的方法 matcher 接受一个 CharSequence 参数,因此您需要将一个 CharSequence(很可能是一个 String)传递给它。

您需要读取文件的内容。有很多方法,这完全取决于您是否知道文件是大还是小。如果它很小,那么您可以读取所有行,将它们收集到一个字符串中并将其传递给 matcher 方法。如果它很大,那么你不能一次全部读取它(你会消耗大量内存)所以你需要分块读取它。

考虑到您需要浏览内容并找到特定模式,这可能很困难 - 假设您的模式比单个块长。因此,如果您的文件真的很大,我建议多考虑一下正确的方法。

检查这个以读取文件内容:How do I create a Java string from the contents of a file?

我把方法改成这样:

 public void countWord(String word, File file) throws FileNotFoundException {
                int count = 0; 
                Scanner scanner = new Scanner(file);
                while (scanner.hasNextLine()) {
                String nextToken = scanner.next();

                Pattern pattern = Pattern.compile(word);
                java.util.regex.Matcher matcher = pattern.matcher(nextToken);

                while (matcher.find()) {
                count++;
                System.out.println("found: " + count + " : "
                                + matcher.start() + " - " + matcher.end());
                    }
                }

谢谢