当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用Java创建.zip存档的缓冲区大小是多少?》经验,为你挑选了1个好方法。

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

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

for (int i=0;i0;){
        zos.write(buffer,0,read);
    }
    fis.close();
    zos.closeEntry();
}
zos.close();

我不知道zip算法和ZipOutputStream是如何工作的,如果它在我读取并发送到'zos'之前写入所有数据,结果文件的字节大小可能与我选择另一个缓冲区大小不同.

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

读取数据 - >处理数据 - >创建.ZIP

要么

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

如果是这种情况,哪种缓冲区大小最好?

更新:

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



1> Dan Cristolo..:

简短的回答:我会选择像16k这样的东西.


答案很长:

ZIP使用DEFLATE算法进行压缩(http://en.wikipedia.org/wiki/DEFLATE).Deflate是Ziv Lempel Welch(LZW的搜索维基百科)的味道.DEFLATE使用LZ77和Huffman编码.

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

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

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

当从1字节增加到1024字节时,您将丢失1023字节(理论上),并且在.read和.write方法中减少了~1024的开销时间.然而,当从1k增加到64k时,你花费63k,这减少了64倍的开销.

所以这会带来收益递减,因此我会选择中间的某个地方(比方说16k)并坚持下去.

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有