Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java创建.zip存档的缓冲区大小是多少?_Java_Zip_Buffer - Fatal编程技术网

使用Java创建.zip存档的缓冲区大小是多少?

使用Java创建.zip存档的缓冲区大小是多少?,java,zip,buffer,Java,Zip,Buffer,我使用此代码创建一个.zip文件列表: ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile)); for (int i=0;i<srcFiles.length;i++){ String fileName=srcFiles[i].getName(); ZipEntry zipEntry = new ZipEntry(fileName); zos.putNextEntry(zip

我使用此代码创建一个.zip文件列表:

ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile));

for (int i=0;i<srcFiles.length;i++){
    String fileName=srcFiles[i].getName();
    ZipEntry zipEntry = new ZipEntry(fileName);
    zos.putNextEntry(zipEntry);
    InputStream fis = new FileInputStream(srcFiles[i]);
    int read;
    for(byte[] buffer=new byte[1024];(read=fis.read(buffer))>0;){
        zos.write(buffer,0,read);
    }
    fis.close();
    zos.closeEntry();
}
zos.close();
ZipOutputStream zos=newzipoutpstream(newfileoutputstream(zipFile));
对于(int i=0;i0;){
写入(缓冲区,0,读取);
}
fis.close();
zos.closeEntry();
}
zos.close();
我不知道zip算法和ZipoutStream是如何工作的,如果它在我读取并发送给“zos”所有数据之前写入了一些内容,那么结果文件的字节大小可能与我选择另一个缓冲区大小不同

换句话说,我不知道算法是否如下:

读取数据-->过程数据-->创建.ZIP

读取数据块-->处理数据块-->在.ZIP中写入数据块-->| ^-----------------------------------------------------------------------------------------------------------------------------

如果是这种情况,什么缓冲区大小是最好的

更新:


我已经测试了这段代码,将缓冲区大小从1024更改为64,并压缩相同的文件:使用1024字节时,80KB的结果文件比使用64字节缓冲区时小3字节。在最短时间内生成最小.zip的最佳缓冲区大小是什么?

取决于您的硬件(磁盘速度和文件搜索时间)。我想说,如果您对压缩最后一点性能不感兴趣,请选择4k和64k之间的任意大小。因为它是一个短暂的对象,所以无论如何都会很快被收集起来。

简短回答:我会选择类似16k的东西


长答覆:

ZIP正在使用DEFLATE算法进行压缩()。Deflate是Ziv-Lempel-Welch(在维基百科上搜索LZW)的一种风格。DEFLATE使用LZ77和哈夫曼编码

这是一个字典压缩,据我所知,从算法的角度来看,将数据输入deflater时使用的缓冲区大小应该几乎没有影响。LZ77最大的影响是字典大小和滑动窗口,它们不受示例中缓冲区大小的控制

我认为,如果您想要并绘制一个图表,您可以尝试不同的缓冲区大小,但我相信您不会看到压缩比有任何显著变化(3/80000=0.00375%)

缓冲区大小对速度的最大影响是由于调用FileInputStream.read和zos.write时执行的开销代码量。从这个角度来看,你应该考虑你的收获和花费

当从1字节增加到1024字节时,您将丢失1023字节(理论上),并且.read和.write方法的开销时间减少了约1024个字节。 但是,当从1k增加到64k时,您将花费63k,这将开销减少64倍


<> P>这是因为收益递减,因此我会选择中间的某个地方(比如说16K),然后坚持下去。

我接受这个答案,因为它表明缓冲区大小不会影响结果的大小,而是字典大小和滑动窗口。