【问题标题】:Writing GZIP file with nio使用 nio 编写 GZIP 文件
【发布时间】:2012-02-22 11:42:49
【问题描述】:

这是我的代码:

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

我收到了 zip,但它的内容已损坏。

【问题讨论】:

    标签: java io gzip nio


    【解决方案1】:

    我愿意:

    GZIPOutputStream gzipOS = new GZIPOutputStream(new FileOutputStream("C:\\temp\\111.gz"));
    WritableByteChannel out = Channels.newChannel(gzipOS);
    

    并且只需使用out.write() 来使用 NIO 进行编写。以后别忘了关闭资源。

    【讨论】:

    • out.write 需要 ByteBuffer
    • 无论如何 out.write(ByteBuffer.wrap(("string" + "\n").getBytes()));同样结果损坏文件
    • 是的,您需要ByteBuffer。文件损坏是什么意思?
    • 好吧,zip 文件的大小为 0,但里面的文件大小为 0。当我尝试使用一些 3rd 方软件查看它时,我得到了错误
    • 我假设你没有 flush()close() gzipOS。只有当数据被写出时。
    【解决方案2】:

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

    编辑
    假设这里的 .zip 扩展名不是错误的(虽然它仍然很糟糕):

    1. 您可能应该考虑在关闭它之前调用out.finish()
    2. 我很确定您不需要所有频道内容。您可以简单地将 FileOutputStream 传递给 GZIPOutputStream

    【讨论】:

    • 我想用nio来提高性能,但是完成了工作!!!我现在正在为一个大文件运行测试...
    • 另一个问题:如何为压缩文件设置名称?现在它与 zip 具有相同的名称,但没有扩展名。
    • @omrid 哪里说蔚来会显着提升性能?你量过吗?您有性能问题吗?
    • @EJP NIO 在这种情况下不会显着提高性能,因为实际工作的是 GZIP。
    • @TomvanderWoerdt 正是我的观点。开销在别处。
    【解决方案3】:

    当您调用 out.close() 时,它也会关闭底层流/通道。

    如果您先关闭底层通道,则无法写入任何缓冲数据或页脚。

    GZIP 格式包含一个必须在末尾的 CRC32,在您关闭流之前无法写入,我预计这会丢失,因此无法验证文件内容。最简单的解决方案是不要自己关闭底层通道。

    顺便说一句:通常最好以与创建资源相反的顺序关闭资源。 ;)

    【讨论】:

      猜你喜欢
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      • 1970-01-01
      • 1970-01-01
      • 2021-05-30
      相关资源
      最近更新 更多