用于输入gzip数据流的java.util.Iterator
我的客户端有一个以InputStream为参数的API,我的数据来自java.util.Iterator,因此基本上我需要将数据从一个迭代器传输到InputStream。更重要的是,我想以GZIP格式传输它,所以基本上我需要生成一个包含迭代器GZIP内容的InputStream用于输入gzip数据流的java.util.Iterator,java,streaming,java-io,Java,Streaming,Java Io,我的客户端有一个以InputStream为参数的API,我的数据来自java.util.Iterator,因此基本上我需要将数据从一个迭代器传输到InputStream。更重要的是,我想以GZIP格式传输它,所以基本上我需要生成一个包含迭代器GZIP内容的InputStream 由于我希望尽可能地提高速度和内存效率,因此我希望有一个流式解决方案,我已经知道,我可以使用GZIPOutputStream将数据写入文件,然后使用FileInputStream读取数据。您需要使用编写自己的逻辑来压缩数据
由于我希望尽可能地提高速度和内存效率,因此我希望有一个流式解决方案,我已经知道,我可以使用GZIPOutputStream将数据写入文件,然后使用FileInputStream读取数据。您需要使用编写自己的逻辑来压缩数据,并且需要实现,您至少应该在其中实现、和方法 以下是我对如何实现读取的伪代码的看法:
这当然是简化了。您需要正确初始化deflater、处理空迭代器、用换行符分隔字符串等。当您的源已经解压缩时,为什么要生成GZIPInputStream,即来自压缩源的未压缩数据流?@Andreas,我想您是对的,我仍然需要一个InputStream,但是使用Gzip压缩数据..所以实际上我需要一种从我的迭代器库Andreas动态生成Gzip的方法,我将研究Deflator。希望平减指数不需要同时使用所有数据…@humbletrader它不需要,这就是为什么伪代码不断为迭代器中的每个字符串调用setInput。当你打最后一个电话时,你也会打电话给finish,告诉泄气器这是最后一部分。
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
}