Распаковка файла очень медленная - PullRequest
2 голосов
/ 01 сентября 2011

Я написал некоторый код, который извлекает zip-файл и распаковывает его в директорию.ZIP-файл содержит две папки, и в зависимости от того, в какой папке находится каждый файл, он распаковывается в папку этого каталога.

Однако запуск кода занимает очень много времени (около 10 минут).Хотя в каждой папке содержится около 1000 файлов, а общий размер zip-файла составляет 5000 КБ.Я думаю, что это идет медленно, потому что я создаю FileOutputStream и InputStream каждый раз, когда я вхожу в цикл.Однако мне нужно сделать это, поскольку я не знаю выходной каталог файла, пока не прочитал его из zip-файла.(Т.е. выяснить, в какой папке он находится)

Есть предложения?

/**
 * Retrieves and unzips a file from its URL
 */
public void retrieveFiles(String URL) {

    //Retrieve file from URL
    File zip = new File(getFile(URL));
    zip.mkdirs();

    try {
        //Create .zip file from file directory
        ZipFile zipFile = new ZipFile(zip);
        Enumeration<? extends ZipEntry> enumeration = zipFile.entries();

        //While zip file contains elements, get the next zipped file
        while (enumeration.hasMoreElements()) {
            ZipEntry zipEntry = (ZipEntry) enumeration.nextElement();

            //Ignore folders and other zip files
            if(!zipEntry.isDirectory() && !zipEntry.getName().endsWith(".zip")){

                //Find directory and filename for new unzipped file
                String directory = getURL(zipEntry.getName());
                String fileName = getFileName(zipEntry.getName());
                String fullDirectory = createDirectory(directory, fileName);

                //Unzip file and store in directory
                System.out.println("Unzipping file: " + fileName);
                FileOutputStream fout = new FileOutputStream(fullDirectory);
                InputStream in = zipFile.getInputStream(zipEntry);
                for (int c = in.read(); c != -1; c = in.read()) {
                    fout.write(c);
                }
                zipFile.getInputStream(zipEntry).close();
                in.close();
                fout.close();
            }
        }
        zipFile.close();
        System.out.println("Unzipping complete!");

        zip.delete();

    } catch (IOException e) {
        System.out.println("Unzip failed");
        e.printStackTrace();
    }
}

Ответы [ 2 ]

5 голосов
/ 01 сентября 2011

Вы копируете файл по одному байту за раз

for (int c = in.read(); c != -1; c = in.read())
    fout.write(c);
}

Вы можете попробовать использовать Apaches org.apache.commons.io.IOUtils.copy (), так как это будет копировать порциями и использоватьНИО и другие улучшения.Вы можете найти его в commons-io.jar

0 голосов
/ 01 сентября 2011

Попробуйте сначала загрузить файлы в память, X mb за раз, когда захотите, а затем создайте поток ввода-вывода в файл.

...