【问题标题】:Java: stream processing of data which comes in chunksJava:数据块的流处理
【发布时间】:2017-03-12 06:52:54
【问题描述】:

假设我们有一些网络或其他进程,它们以块的形式获取我们需要的数据。每个块都是一个字节数组。数据的本质只是一个由多行组成的简单文本文件。我们要逐行处理这个文件。这可能吗?

一个简单的方法是等到所有数据都来了,同时将所有块添加到 ByteBuffer,或者简单地通过 System.arrayCopy 将它们合并到一个大字节数组中。在此之后,我们可以从中创建大字符串并逐行读取,或者创建 ByteArrayInputStream 并在转换为 InputStreamReader 后使用一些 Reader 读取。

好的,但是我们可以用真正的流方式来做,在下一个块到达时读取它吗?不保证块包含一些完整的行数。它可以在行的中间结束,这应该被处理,即在这种情况下,我们应该等待下一个块。

有没有办法在不等待文件结束的情况下做到这一点?

【问题讨论】:

    标签: java stream inputstream


    【解决方案1】:

    这与仅从 BufferedReader 读取并没有什么不同;不同之处在于 BufferedReader 在处理当前块时不会在后台缓冲更多数据;它一直等到它为空,然后您调用一些 read() 方法。但如果没关系,请将 BufferedReader 连接到您的输入并保持简单。

    如果您需要并行读取,请查看 PipedInputStream/PipedOutputStream。它们是成对的,想法是让一个线程将从流中读取的数据写入 PipedOutputStream,然后另一个线程从 PipedInputStream 读取数据。

    或者您可以使用非阻塞 IO,但这涉及保存处理上下文,以便您以后可以恢复它。

    【讨论】:

      猜你喜欢
      • 2019-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-22
      • 2013-04-25
      • 2018-02-16
      • 2022-08-10
      • 2021-07-06
      相关资源
      最近更新 更多