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