Java 当我确实要压缩时。这就是全部。无论如何,请检查是否正在刷新输出流

Java 当我确实要压缩时。这就是全部。无论如何,请检查是否正在刷新输出流,java,stream,zip,deflate,on-the-fly,Java,Stream,Zip,Deflate,On The Fly,Gzip vs-zip 另外:一件事是GZIP(压缩流,这就是您正在做的),另一件事是编写有效的zip文件(文件头、文件目录、条目(头、数据)*)。检查ZipOutputStream我认为DeflaterOutputStream.flush()没有任何意义。平减指数将累积数据,直到它有东西写入底层流。强制输出剩余数据位的唯一方法是调用DeflaterOutputStream.finish()。然而,这对您当前的实现不起作用,因为在完全完成编写之前,您无法调用finish 实际上,在同一个线程中编

Gzip vs-zip


另外:一件事是GZIP(压缩流,这就是您正在做的),另一件事是编写有效的zip文件(文件头、文件目录、条目(头、数据)*)。检查
ZipOutputStream

我认为
DeflaterOutputStream.flush()
没有任何意义。平减指数将累积数据,直到它有东西写入底层流。强制输出剩余数据位的唯一方法是调用
DeflaterOutputStream.finish()
。然而,这对您当前的实现不起作用,因为在完全完成编写之前,您无法调用finish


实际上,在同一个线程中编写压缩流并读取它是非常困难的。在这个项目中,我实际上是这样做的,但是您需要一个任意大小的中间输出缓冲区(您基本上需要将数据推入,直到另一端压缩出来,然后您就可以读取它)。您可以使用该项目中的一些util类来完成您想要做的事情。

如果您在某个地方使用该方法,请小心
int read(字节b[],int off,int len)
final int iBufferedBytes=iStream.read(iBuffer)


你会陷入无限循环

我有点迷路了。但是当我不想压缩时,我应该简单地使用原始的
outputStream
,当我想压缩时,我应该简单地使用新的GZipOutputStream(outputStream)
。这就是全部。无论如何,请检查是否正在刷新输出流。
ByteArrayOutputStream
!=<代码>缓冲输出流。非常感谢您的回复。使用GZipOutputStream和ZipOutputStream一样没有效果。我只是简单地将输出流完全修剪:“Lorem ipsum…”从446变成我在问题中提到的两个字节。我不能直接使用OutputStream,因为要求将InputStream委托给JDBC准备好的语句(因为可能有大量的传入数据)。这就是为什么我要寻找一个像MyApp(inputStream)-->[compressor]-->JDBC(inputStream)这样的代理类。“你基本上需要将数据推入,直到另一端的数据被压缩出来。”这是最大的问题之一(除非你能负担得起一次压缩整个内容);一个低效(但简单)的解决方案是将数据压缩成离散的“数据包”,前提是您能够进行解压缩到该代码示例。最后它压缩了“lorem ipsum”文本示例。感谢您指向
.finish()
:)@LyubomyrShaydariv——不过,您意识到,一旦调用finish,您的压缩流就完成了。您将永远无法处理超过512字节的压缩数据。您当前的代码并不是一个真正的“通用”解决方案。是的,我第一个想到的是“是的,它可以工作”。但是,它只适用于446长度的
Lorem ipsum…
text等等。当我将文本加倍压缩(892b)时,由于您提到的原因,它失败了。不管怎样,我们今天彻底地修改了
read()
方法,最后它可以在飞行中为放气机和充气机工作。我刚才说谢谢你指出了
finish()
方法,现在我在输入流结束后调用它。问题中的源代码还忽略了一个事实,即结果字节数组缓冲区中的-1被视为流的结尾,而不是实际的
0xFF
数据。