gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:17:01 26 4
gpt4 key购买 nike

我使用此代码创建一个包含文件列表的 .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();

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

换句话说,我不知道算法是不是这样的:

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

读取数据 block -->处理数据 block -->将数据 block 写入.ZIP-->|^------------------------------------------------ ---------------------------------------------- --------------------------

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

更新:

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

最佳答案

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


长答案:

ZIP 使用 DEFLATE 算法进行压缩 (http://en.wikipedia.org/wiki/DEFLATE)。 Deflate 是 Ziv Lempel Welch 的一种风格(在维基百科中搜索 LZW)。 DEFLATE 使用 LZ77 和霍夫曼编码。

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

我认为您可以根据需要尝试不同的缓冲区大小并绘制图表,但我相信您不会看到压缩率 (3/80000 = 0.00375%) 有任何显着变化。

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

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

所以这伴随着 yield 递减,因此我会选择中间的某个地方(比如 16k)并坚持下去。

关于java - 使用 Java 创建 .zip 存档的缓冲区大小是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/200752/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com