从FileChannel读取所有行到字符串流

Yur*_*kov 9 java nio java-8 java-stream

对于我的具体任务,我需要将数据读取FileChannelStream(或Collection)String的.

在常规NIOPath我们可以使用方便的方法Files.lines(...)返回一个Stream<String>.我需要得到相同的结果,但是从而FileChannel不是Path:

public static Stream<String> lines(final FileChannel channel) {
//...
}
Run Code Online (Sandbox Code Playgroud)

任何想法如何做到这一点?

Hol*_*ger 10

我假设您希望在返回关闭时关闭通道Stream,因此最简单的方法是

public static Stream<String> lines(FileChannel channel) {
    BufferedReader br = new BufferedReader(Channels.newReader(channel, "UTF-8"));
    return br.lines().onClose(() -> {
        try { br.close(); }
        catch (IOException ex) { throw new UncheckedIOException(ex); }
    });
}
Run Code Online (Sandbox Code Playgroud)

它实际上并不需要FileChannel输入,一个ReadableByteChannel就足够了.

请注意,这也属于"常规NIO"; java.nio.file有时被称为"NIO.2".

  • 哦,你刚刚通过`onClose`纠正了我们代码库中的错误.谢谢 (2认同)