【问题标题】:java.util.Iterator<String> to InputStream of gzipped datajava.util.Iterator<String> 到 gzipped 数据的 InputStream
【发布时间】:2018-09-09 20:16:28
【问题描述】:

我的客户端有一个 API,它以 InputStream 作为参数,我的数据来自 java.util.Iterator,所以基本上我需要将数据从一个 Iterator 传输到 InputStream。更重要的是,我想以 GZIP 格式传输它,所以基本上我需要生成一个 InputStream,其中包含 Iterator gzipped 的内容。

由于我希望尽可能快且内存效率高,因此我很欣赏“流式传输”解决方案(我已经知道我可以使用 GZIPOutputStream 将数据写入文件,然后使用 FileInputStream 读取)

【问题讨论】:

  • 当您的源已经解压缩时,为什么要生成GZIPInputStream,即来自压缩源的解压缩数据流?
  • @Andreas,我想你是对的,我仍然需要一个 InputStream 但使用 Gzip 压缩数据..所以实际上我需要一种从我的 Iterator动态生成 Gzip 的方法>

标签: java streaming java-io


【解决方案1】:

您需要使用Deflater编写自己的逻辑来压缩数据,并且您需要实现一个InputStream,您应该至少实现read()read(byte[] b, int off, int len)close()方法。

这是我对如何实现read 的伪代码的看法:

public int read(byte[] b, int off, int len) {
    if deflater finished:
        return -1
    if deflater needs input:
        get next string from iterator
        deflater.setInput(s.getBytes("UTF-8"))
        if iterator at end:
            deflater.finish()
    deflate into b using off and len
}

这当然是简化的。您需要正确初始化 deflater、处理空迭代器、用换行符分隔字符串等。

【讨论】:

  • 谢谢 Andreas,我会看看 Deflator。希望 Deflator 不需要一次所有的数据......
  • @humbletrader 它没有,这就是伪代码不断为迭代器中的每个字符串调用setInput() 的原因。当你打最后一个电话时,你也打电话给finish() 告诉放气机这是最后一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
相关资源
最近更新 更多