用nio编写GZIP文件

时间:2012-02-22 11:42:50

标签: java io gzip nio

这是我的代码:

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) {
        }
    }    }

我得到拉链但它的内容已损坏。

3 个答案:

答案 0 :(得分:1)

如果您使用gzip流,为什么要将其保存为zip?使用.gz作为扩展名。

修改
假设这里不是.zip扩展错误(虽然它仍然很糟糕):

  1. 您应该考虑在关闭之前调用out.finish()
  2. 我很确定你不需要所有的频道资料。您只需将FileOutputStream传递给GZIPOutputStream
  3. 即可

答案 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,它必须在最后,在你抓住流之前不能写,我希望这个丢失,所以无法验证文件内容。最简单的解决方案是不要自己关闭底层渠道。

顺便说一句:通常最好按照创建它们的相反顺序关闭资源。 ;)