Java 用nio编写GZIP文件

Java 用nio编写GZIP文件,java,io,gzip,nio,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

这是我的代码:

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) {
        }
    }    }
WritableByteChannel通道=null;
GZIPOutputStream out=null;
试一试{
channel=Channels.newChannel(新文件输出流(“C:\\temp\\111.zip”);
out=新的GZIPOutputStream(Channels.newOutputStream(channel));
对于(长i=0;i<1000000000;i++){
out.write((“字符串”+i+“\n”).getBytes();
} 
}捕获(例外e){
e、 printStackTrace();
}最后{
试一试{
如果(通道!=null){
channel.close();
}
}捕获(例外e){
}
试一试{
if(out!=null){
out.close();
}
}捕获(例外e){
}
}    }

我有拉链,但里面的东西坏了

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

编辑
假设这里不是.zip扩展的错(尽管仍然很糟糕):

  • 在关闭之前,您应该考虑调用<代码> Out.FixSee()/<代码>
  • 我很确定你不需要所有频道的东西。您只需将FileOutputStream传递给GZIPOutputStream

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

    编辑
    假设这里不是.zip扩展的错(尽管仍然很糟糕):

  • 在关闭之前,您应该考虑调用<代码> Out.FixSee()/<代码>
  • 我很确定你不需要所有频道的东西。您只需将FileOutputStream传递给GZIPOutputStream
  • 我会:

    GZIPOutputStream gzipOS = new GZIPOutputStream(new FileOutputStream("C:\\temp\\111.gz"));
    WritableByteChannel out = Channels.newChannel(gzipOS);
    
    只需使用
    out.write()
    即可使用NIO进行编写。不要忘记稍后关闭资源。

    我会:

    GZIPOutputStream gzipOS = new GZIPOutputStream(new FileOutputStream("C:\\temp\\111.gz"));
    WritableByteChannel out = Channels.newChannel(gzipOS);
    
    只需使用
    out.write()
    即可使用NIO进行编写。不要忘记稍后关闭资源。

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

    如果首先关闭基础通道,则无法写入任何缓冲数据或页脚

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

    顺便说一句:通常,最好按照创建资源的相反顺序关闭资源

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

    如果首先关闭基础通道,则无法写入任何缓冲数据或页脚

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



    顺便说一句:通常,最好按照创建资源的相反顺序关闭资源

    out.write需要ByteBuffer.out.write(ByteBuffer.wrap((“字符串”+“\n”).getBytes());相同的结果损坏了文件是的,您将需要
    ByteBuffer
    。你所说的损坏文件是什么意思?zip文件的大小是,而里面的文件的大小是0。当我试图用一些第三方软件查看它时,我发现了一个错误,我假设你没有
    flush()
    close()
    gzip
    。这仅在数据被写出时发生。out.write需要ByteBuffer.out.write(ByteBuffer.wrap((“string”+“\n”).getBytes());相同的结果损坏了文件是的,您将需要
    ByteBuffer
    。你所说的损坏文件是什么意思?zip文件的大小是,而里面的文件的大小是0。当我试图用一些第三方软件查看它时,我发现了一个错误,我假设你没有
    flush()
    close()
    gzip
    。这只是当数据被写出来的时候。我想用nio来提高性能,但最后还是写出来了!!!我正在运行一个大文件的测试…另一个问题:如何设置压缩文件的名称?现在它的名称与zip相同,但没有扩展。@omrid它在哪里说NIO将显著提高性能?你量过了吗?您有性能问题吗?@EJP NIO在这种情况下不会显著提高性能,因为实际的困难工作是GZIP。@Tomvanderwoerd这正是我的观点。开销在其他地方。我想使用nio来提高性能,但最终还是失败了!!!我正在运行一个大文件的测试…另一个问题:如何设置压缩文件的名称?现在它的名称与zip相同,但没有扩展。@omrid它在哪里说NIO将显著提高性能?你量过了吗?您有性能问题吗?@EJP NIO在这种情况下不会显著提高性能,因为实际的困难工作是GZIP。@Tomvanderwoerd这正是我的观点。头顶在别处。