我的客户端有一个API,它将InputStream作为参数,我的数据来自java.util.Iterator,所以基本上我需要将数据从一个Iterator传输到一个InputStream。更重要的是,我想以GZIP格式传输它,所以基本上我需要生成一个带有Iterator gzip的内容的InputStream。
由于我希望尽可能快地提高内存效率,我希望得到一个“流式”解决方案(我已经知道我可以使用GZIPOutputStream将数据写入文件,然后使用FileInputStream读取它)
答案 0 :(得分:1)
您需要使用Deflater
编写自己的逻辑来压缩数据,并且需要实现InputStream
,您应该至少实现read()
,{{3} }和read(byte[] b, int off, int len)
方法。
以下是伪代码,介绍如何实现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,处理空迭代器,使用换行符分隔字符串等。