多线程文件使用java.util.zip.ZipEntry解压缩

时间:2014-02-18 04:00:15

标签: java multithreading unzip

我正在使用:

java.util.zip

我有一个while循环读缓冲区,直到它清楚。我正在从一个文件夹中读取2个或更多文件,但我想要更快的东西。我想使用Threads。如果我为每个文件使用一个线程,那么当我解压缩1GB文件时,我也不会在解压缩较小的文件时看到任何差异。

我如何与Threads分享这份工作?我无法从不同的线程中读取流(可以吗?)。

2 个答案:

答案 0 :(得分:0)

今天的平均电脑处理zip解压缩要比硬盘提供数据快得多。这适用于大多数SSD以及总线是限制因素。

因此,任何通过更改CPU利用率来加速进程的尝试都将失败。您可以做的最好的事情是分离读写,如果源和目标位于不同的设备上,这可能会增加收益。

或者在解压缩多线程之后进行处理。但是,如果您只是阅读和删除数据,则无法显着加快该过程。

答案 1 :(得分:0)

如果您希望多个线程以可伸缩的方式从同一个zip文件读取,则必须为每个线程打开一个ZipFile实例。这样,ZipFile方法中的每线程锁定不会阻止只有一个线程一次读取zipfile。这也意味着当每个线程在完成读取后关闭ZipFile时,它们将关闭自己的实例,而不是共享实例,因此您不会在第二次及其后的关闭中遇到异常。

Protip:如果您真的关心速度,可以通过从第一个ZipFile实例读取所有ZipEntry对象并与所有线程共享它们来获得更高的性能,以避免在读取{{1} }每个线程的对象。 ZipEntry对象本身并不绑定到特定的ZipEntry实例,ZipFile仅记录元数据,该元数据将与代表与{{1 }}来自。