你需要打电话
((GZIPOutputStream)output2).finish();
冲洗前。在此处查看javadoc。它指出
完成压缩数据写入输出流的操作,而无需关闭基础流。将多个过滤器连续应用于同一输出流时,请使用此方法。
你在做什么 所以
for (int length = 0; (length = input.read(buffer)) > 0;)
output2.write(buffer, 0, length);
}
((GZIPOutputStream)output2).finish(); //Write the compressed parts
// obvIoUsly make sure output2 is truly GZIPOutputStream
output2.flush(); //
关于 将多个过滤器连续应用于同一输出流的主题 ,这就是我的理解方式:
您有一个OutputStream
到HTTP服务器的,即套接字连接。该HttpUrlConnection
写头,然后你直接写体。在这种情况下(多部分),您将边界和标头发送为未压缩的字节,已压缩的文件内容,然后再次发送边界。因此,流最终看起来像这样:
start writing with GZIPOutputStream
v
|---boundary---|---the part headers---|---gzip encoded file content bytes---|---boundary---|
^ ^
write directly with PrintWriter use PrintWriter again
因此,您可以看到如何用不同的过滤器依次编写不同的部分。请将PrintWriter
视为未过滤的过滤器,您提供的任何内容都将直接编写。的GZIPOutputStream
是一个gzip滤波器,其编码(的gzip)字节它给。
至于源代码,看在你的Java JDK的安装,你应该有一个src.zip
包含公开的源代码文件,java.lang*
,java.util.*
,java.io.*
,javax.*
,等。