java - 在 Java 中逐行读取文本文件的最快方法

标签 java file-io readline text-files

对于日志处理,我的应用程序需要逐行读取文本文件。 首先我使用了 BufferedReader 的函数 readLine() 但我在网上看到 BufferedReader 在读取文件时很慢。
之后,我尝试将 FileInputStream 与 FileChannel 和 MappedByteBuffer 一起使用,但在这种情况下,没有类似于 readLine() 的功能,所以我在我的文本中搜索换行符并对其进行处理:

    try {
        FileInputStream f = new FileInputStream(file);
        FileChannel ch = f.getChannel( );
        MappedByteBuffer mb = ch.map(FileChannel.MapMode.READ_ONLY, 0L, ch.size());
        byte[] bytes = new byte[1024];
        int i = 0;
        while (mb.hasRemaining()) {
            byte get = mb.get();
            if(get == '\n') {
                if(ra.run(new String(bytes)))
                    cnt++;
                for(int j = 0; j<=i; j++)
                    bytes[j] = 0;
                i = 0;
            }
            else
                bytes[i++] = get;
        }
    } catch(Exception ex) {
        ex.printStackTrace();
    }

我知道这可能不是实现它的好方法,但是当我以字节为单位读取文本文件时,它比使用 BufferedReader 快 3 倍,但调用 new String(bytes) 会创建一个new String 并使程序比使用 BufferedReader 时更慢。
所以我想问一下逐行读取文本文件的最快方法是什么?有人说 BufferedReader 是解决这个问题的唯一方法。

附言:ra 是 dk.brics.Automaton 库中的 RunAutomaton 实例。

最佳答案

我非常怀疑 BufferedReader 会导致很大的开销。添加您自己的代码可能至少同样低效,而且很可能也是错误的。

例如,在您提供的代码中,您正在调用 new String(bytes),它始终会使用平台默认编码从 1024 字节创建一个字符串...这不是个好主意。当然,您随后清除了数组,但您的字符串仍将包含一堆 '\0' 字符 - 这意味着大量的空间浪费,除此之外。您应该至少限制从中创建字符串的字节数组部分(这也意味着您不需要之后清除数组)。

您是否真的尝试过使用BufferedReader 并发现它太慢了?您通常应该首先编写最简单的代码来满足您的目标,然后检查它是否足够快......特别是如果您不这样做的唯一原因是您“在互联网上阅读”的未指定资源。你想让我找到数百个关于人们提出不正确性能建议的例子吗? :)

作为替代方案,您可能需要查看 Guava Files.readLines() 的重载需要一个 LineProcessor .

关于java - 在 Java 中逐行读取文本文件的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5800361/

相关文章:

jquery - 如何使用 jQuery 在 div 中的文本后添加文件内容?

readline - 在Android的QPython控制台中访问命令历史记录

java - 如何生成protobuf 3.0 jar java?

java - Spring JPA hibernate : slow SELECT query

java - setCharacterStream 引起的 AbstractMethodError

ios - 当我打开文件句柄以供读取时,NSString 如何写入文件?

c++ - 如何找到我的进程在 Linux 中打开的文件句柄?

node.js - 如何在 Node.js 中逐行读取 child_process?

r - 在 R 包中测试与用户的交互

java - 在递归函数中使用 Scanner 类