【问题标题】:Efficient method to read String lines from file从文件中读取字符串行的有效方法
【发布时间】:2011-02-06 15:09:27
【问题描述】:

假设我有 15GB 的日志记录文件,并且我想从这个文件中遍历 \n 终止的行。什么 java 标准库/第 3 方为此操作提供了干净的接口。

请注意,我正在寻找一个基于 NIO 的解决方案,最好使用内存映射文件访问方法,正如这个问题所演示的那样 How do I create a Java string from the contents of a file? 将是一个完美的解决方案,如果它在返回之前没有将整个字节缓冲区加载到内存中缓冲区的新 String() 实例。由于输入的大小,这种方法在这种情况下不起作用。

谢谢你,
马克西姆。

【问题讨论】:

    标签: java string streaming nio


    【解决方案1】:

    您是否考虑过使用BufferedReader?来自文档:

    从字符输入流中读取文本,缓冲字符以提供字符、数组和行的高效读取

    它有一个干净的接口用于获取以\n 结尾的字符串 (BufferedReader.readLine()),并且由于它是缓冲的,因此应该相当高效。

    【讨论】:

    • +1:瓶颈可能是从磁盘读取 15 GB 文件所需的时间。你如何做到这一点不太重要。所以最好保持简单。
    【解决方案2】:

    恕我直言,您不需要任何 NIO 来完成此任务。使用常规的 BufferedReader:

    BufferedReader reader = new BufferedReader(new FileReader("myfile.log"));

    然后是用户reader.readLine()

    【讨论】:

      【解决方案3】:

      它不是基于 NIO,但我会看看 Guava 的方法 CharStreams.readLines(InputSupplier, LineProcessor)。它做你想要我说的:

      File file = ...
      Foo result = CharStreams.readLines(Files.newReaderSupplier(file, Charsets.UTF_8),
          new LineProcessor<Foo>() {
            public boolean processLine(String line) {
              // do stuff for this line
              return true; // or false if you want to stop processing here
            }
      
            public Foo getResult() {
              return result; // if you create some result when processing the lines
            }
          });
      

      这使用回调来允许您按顺序处理文件中的每一行。在您处理完当前行之前,它不会将下一行加载到内存中。如果您不想在读取行时创建单个结果对象,您可以简单地使用LineProcessor&lt;Void&gt; 并让getResult() 返回null

      【讨论】:

        猜你喜欢
        • 2013-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-22
        • 1970-01-01
        • 2011-06-29
        • 2019-05-23
        相关资源
        最近更新 更多