跳过一行而不在 Java 的 .log 文件中读取它

Skipping a line without reading it in a .log file in Java

提问人:SAMUELE BERNARDI 提问时间:7/3/2023 最后编辑:Dmitriy PopovSAMUELE BERNARDI 更新时间:7/3/2023 访问量:47

问:

我必须读取一个 8GB 的 .log 文件来提取一些信息,但在该文件中,有很多行我不需要。其中一些太长(超过 15,000,000 个字符),以至于会减慢代码速度,并且需要一天多的时间才能全部阅读(无需执行任何其他操作)。

我需要一些可以读取行中第一个单词的东西,如果它以特定序列开头,则跳过它而不读取任何字符。

我尝试了 ,但由于它说它跳过了匹配的模式,因此它必须读取该行才能匹配它。这样,它仍然读取极长的字符序列,这使得程序太慢。skip

这是我到目前为止完成的代码:

            File logFile = new File(logFilePath);
            Scanner fileScanner = new Scanner(logFile);

            while (fileScanner.hasNextLine()) {
                String currentLine = fileScanner.next();          
                if (currentLine.equals("messaggio:")) {
                    fileScanner.skip("\n");             // This is where I want to skip the line WITHOUT reading it
                }
                else {
                    // Other code
                }
            }

            fileScanner.close();
Java 文件 跳过

评论

3赞 daniu 7/3/2023
我想不出任何技术可以让你以你似乎打算的方式“跳过线路”。如果不检查行分隔符,你怎么知道它是“一条线”?
0赞 Sweeper 7/3/2023
线的长度是否相同,或者它们的长度是否遵循特定的模式?
0赞 SAMUELE BERNARDI 7/3/2023
@Sweeper没有线的长度不相同
2赞 Mar-Z 7/3/2023
请分享阅读行的代码。也许我们可以帮助提高性能。例如,使用 BufferedReader。
1赞 user3437460 7/3/2023
不是你问题的答案,但我认为你可以开始研究日志轮换以及你是否记录了比需要更多的东西。您是否正在尝试搜索是否发生了特定事件?您可以简要地告诉我们您要对日志执行的操作。此外,让我感到困惑的是,什么样的日志会在一行日志中包含 150 万个字符。

答:

0赞 Mar-Z 7/3/2023 #1

还行。仅仅使用没有任何缓冲的 Scanner API 是一个坏主意。请尝试以下操作:

溶液

        BufferedReader in
                = new BufferedReader(new FileReader("data/test.log"));
        in.lines().parallel()
                .filter(l -> l.startsWith("messagio:"))
                .forEach(TestApplication::doSomething);