如何将文件传递给Java Matcher?

时间:2017-11-30 15:24:34

标签: java compilation 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

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

2 个答案:

答案 0 :(得分:1)

当然你不能把文件转换为CharSequence,它们彼此无关。

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

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

考虑到您需要查看内容并找到特定模式,这可能很难 - 假设您的模式比单个模块长。因此,如果您的文件非常大,我建议您更多地考虑正确的方法。

选中此项以阅读文件内容:How do I create a Java string from the contents of a file?

答案 1 :(得分:0)

我以这种方式修改了方法:

 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());
                    }
                }

由于