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扩展的错(尽管仍然很糟糕):
如果您使用的是gzip流,为什么要将其保存为zip?使用
.gz
作为扩展名
编辑假设这里不是.zip扩展的错(尽管仍然很糟糕):
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这正是我的观点。头顶在别处。