【发布时间】:2010-07-23 19:49:02
【问题描述】:
我注意到,与使用 WinZip 等本机工具相比,Java 中的解压缩工具非常慢。
是否有更高效的 Java 第三方库可用? 开源是首选。
编辑
这是使用 Java 内置解决方案与 7zip 的速度比较。 我在原始解决方案中添加了缓冲输入/输出流(感谢 Jim,这确实产生了很大的不同)。
压缩文件大小:800K Java 解决方案:2.7 秒 7Zip 解决方案:204 毫秒
下面是使用内置Java解压的修改代码:
/** Unpacks the give zip file using the built in Java facilities for unzip. */
@SuppressWarnings("unchecked")
public final static void unpack(File zipFile, File rootDir) throws IOException
{
ZipFile zip = new ZipFile(zipFile);
Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) zip.entries();
while(entries.hasMoreElements()) {
ZipEntry entry = entries.nextElement();
java.io.File f = new java.io.File(rootDir, entry.getName());
if (entry.isDirectory()) { // if its a directory, create it
continue;
}
if (!f.exists()) {
f.getParentFile().mkdirs();
f.createNewFile();
}
BufferedInputStream bis = new BufferedInputStream(zip.getInputStream(entry)); // get the input stream
BufferedOutputStream bos = new BufferedOutputStream(new java.io.FileOutputStream(f));
while (bis.available() > 0) { // write contents of 'is' to 'fos'
bos.write(bis.read());
}
bos.close();
bis.close();
}
}
【问题讨论】:
-
我的解压缩功能没有问题,我一直在处理 250 MB 的 zip 文件,其中包含压缩文本文件。你在做什么,要花这么长时间?是不是很复杂?
-
也许你是在低优先级线程中做的?
-
我强烈推荐:
if( entry.getName().contains("..") ) continue; -
这个问题的答案是有用的,但有用性与问题无关(因为问题本身不正确)。我很想将问题更改为“为什么我的解压缩 Java 代码这么慢”以帮助未来的搜索者......不过,最佳答案非常好。我去换个问题对我来说是个坏主意吗?