Я заметил, что средство распаковки в Java чрезвычайно медленное по сравнению с использованием собственного инструмента, такого как WinZip.Плохая производительность утилиты unzip для Java
Есть ли доступная сторонняя библиотека для Java, которая более эффективна? Предпочитаемый вариант с открытым исходным кодом.
Редактировать
Вот сравнение скорости с помощью встроенного решения Java против 7zip. Я добавил буферизованные потоки ввода/вывода в своем оригинальном решении (спасибо Джим, это действительно имело большое значение).
Zip Размер файла: 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();
}
}
У меня не было проблем с функциями unzip, и я обрабатывал ZIP-файлы размером 250 МБ, которые содержат текстовые файлы с gzipped. Что вы делаете, так долго? Это что-то сложное? –
Возможно, если вы делаете это в потоке с низким приоритетом? –
Я настоятельно рекомендую: 'if (entry.getName(). Содержит (" ..")) continue;' –