这是我的代码:
WritableByteChannel channel = null;
GZIPOutputStream out = null;
try {
channel = Channels.newChannel(new FileOutputStream("C:\\temp\\111.zip"));
out = new GZIPOutputStream(Channels.newOutputStream(channel));
for (long i = 0; i < 10000000000; i++) {
out.write(("string" + i + "\n").getBytes());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (channel != null) {
channel.close();
}
} catch (Exception e) {
}
try {
if (out != null) {
out.close();
}
} catch (Exception e) {
}
} }
我得到拉链但它的内容已损坏。
答案 0 :(得分:1)
如果您使用gzip流,为什么要将其保存为zip?使用.gz
作为扩展名。
修改强>
假设这里不是.zip扩展错误(虽然它仍然很糟糕):
out.finish()
。答案 1 :(得分:1)
我愿意:
GZIPOutputStream gzipOS = new GZIPOutputStream(new FileOutputStream("C:\\temp\\111.gz"));
WritableByteChannel out = Channels.newChannel(gzipOS);
只需使用out.write()
即可使用NIO进行编写。不要忘记以后关闭资源。
答案 2 :(得分:1)
当你调用out.close()时,它也会关闭底层的流/频道。
如果先关闭底层通道,则无法写入任何缓冲的数据或页脚。
GZIP格式包含一个CRC32,它必须在最后,在你抓住流之前不能写,我希望这个丢失,所以无法验证文件内容。最简单的解决方案是不要自己关闭底层渠道。
顺便说一句:通常最好按照创建它们的相反顺序关闭资源。 ;)