鉴于我们有一些网络或其他进程,它们以块的形式获取我们需要的数据。每个块都是一个字节数组。数据的本质只是一个简单的文本文件,由许多行组成。我们想逐行处理这个文件。这可能吗?
这样做的直接方法是等到所有数据到来,同时将所有块添加到ByteBuffer,或者简单地将它们合并到System.arrayCopy的一个大字节数组中。在此之后,我们可以从中创建大型String并逐行读取,或者创建ByteArrayInputStream并在转换为InputStreamReader后使用某些Reader读取它。
好的,但是我们能以真正的流式方式进行,在它到达时读取下一个块吗?不保证块由一些完整的行组成。它可以在行的中间结束,这应该被处理,即在这种情况下我们应该等待下一个块。
有没有办法在不等待文件结束的情况下执行此操作?
答案 0 :(得分:0)
这与仅仅从BufferedReader读取不同;不同之处在于,当正在处理当前的块时,BufferedReader不会在后台缓冲更多数据;它一直等到它为空并且你调用了一些read()方法。但是,如果可以,请将BufferedReader连接到您的输入并保持简单。
如果您需要并行阅读,请查看PipedInputStream / PipedOutputStream。它们配对,并且想法是让一个线程将它从流中读取的数据写入PipedOutputStream,然后另一个线程从PipedInputStream读取。
或者您可以使用非阻塞IO,但这涉及保存处理上下文,以便您以后可以恢复。