从文件中读取字符串行的有效方法

时间:2011-02-06 15:09:27

标签: java string streaming nio

假设我有15GB的日志记录文件,我想从这个文件迭代\ n终止行。 java标准库/第三方为此操作提供了干净的界面。

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

谢谢你,
格言。

3 个答案:

答案 0 :(得分:4)

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

  

从字符输入流中读取文本,缓冲字符,以便有效读取字符,数组和行

它有一个干净的界面来获取\n - 终止的字符串(BufferedReader.readLine()),因为它是缓冲的,所以应该是相当有效的。

答案 1 :(得分:3)

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

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

然后是用户reader.readLine()

答案 2 :(得分:2)

这不是基于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<Void>getResult()返回null