Извлечение Zip на SD-карту происходит очень медленно. Как я могу оптимизировать производительность? - PullRequest
14 голосов
/ 20 октября 2010

Мое приложение загружает ZIP-файл с 350 файлами.Сочетание файлов JPG и HTML.Функция, которую я написал для этого, работает просто отлично, но распаковка длится вечно.Сначала я подумал, что причина может быть в том, что запись на SD-карту идет медленно.но когда я распаковываю тот же почтовый индекс с другим приложением на моем телефоне, это работает намного быстрее.Есть ли что-нибудь, что я мог бы сделать, чтобы оптимизировать его?

вот код:

private void extract() {

    try {
        FileInputStream inStream = new FileInputStream(targetFilePath);
        ZipInputStream zipStream = new ZipInputStream(new BufferedInputStream(inStream));
        ZipEntry entry;
        ZipFile zip = new ZipFile(targetFilePath);

                    //i know the contents for the zip so i create the dirs i need in advance
        new File(targetFolder).mkdirs();
        new File(targetFolder + "META-INF").mkdir();
        new File(targetFolder + "content").mkdir();

        int extracted = 0;

        while((entry = zipStream.getNextEntry()) != null) {
            if (entry.isDirectory()) {
                new File(targetFolder + entry.getName()).mkdirs();
            } else {
                FileOutputStream outStream = new FileOutputStream(targetFolder + entry.getName());
                for (int c = zipStream.read(); c != -1; c = zipStream.read()) {
                    outStream.write(c);
                }
                zipStream.closeEntry();
                outStream.close();

                extracted ++;
            }

            publishProgress(""+(int)extracted*100/zip.size());
        }

        zipStream.close();
        inStream.close();
        //
        new File(targetFilePath).delete();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

благодаря CommonsWare я изменил свой код так:большая разница в производительности.Большое спасибо.

Ответы [ 2 ]

15 голосов
/ 20 октября 2010

Вы читаете и пишете байт одновременно.Попробуйте прочитать и записать блок большего размера за раз.

0 голосов
/ 18 ноября 2014

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

    public boolean rajDhaniSuperFastUnzip(String inputZipFile, String destinationDirectory)
        {
    try {
        int BUFFER = 2048;
        List<String> zipFiles = new ArrayList<String>();
        File sourceZipFile = new File(inputZipFile);
        File unzipDestinationDirectory = new File(destinationDirectory);
        unzipDestinationDirectory.mkdir();
        ZipFile zipFile;
        zipFile = new ZipFile(sourceZipFile, ZipFile.OPEN_READ);
        Enumeration<?> zipFileEntries = zipFile.entries();
        while (zipFileEntries.hasMoreElements()) {
            ZipEntry entry = (ZipEntry) zipFileEntries.nextElement();
            String currentEntry = entry.getName();
            File destFile = new File(unzipDestinationDirectory, currentEntry);
            if (currentEntry.endsWith(".zip")) {
                zipFiles.add(destFile.getAbsolutePath());
            }

            File destinationParent = destFile.getParentFile();

            destinationParent.mkdirs();

            try {
                if (!entry.isDirectory()) {
                    BufferedInputStream is =
                            new BufferedInputStream(zipFile.getInputStream(entry));
                    int currentByte;
                    byte data[] = new byte[BUFFER];

                    FileOutputStream fos = new FileOutputStream(destFile);
                    BufferedOutputStream dest =
                            new BufferedOutputStream(fos, BUFFER);
                    while ((currentByte = is.read(data, 0, BUFFER)) != -1) {
                        dest.write(data, 0, currentByte);
                    }
                    dest.flush();
                    dest.close();
                    is.close();
                }
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }
        zipFile.close();

        for (Iterator<String> iter = zipFiles.iterator(); iter.hasNext();) {
            String zipName = (String)iter.next();
            doUnzip(
                zipName,
                destinationDirectory +
                    File.separatorChar +
                    zipName.substring(0,zipName.lastIndexOf(".zip"))
            );
        }
    } catch (IOException e) {
        e.printStackTrace();
        return false ;
    }
    return true;
}

Надеюсь, это поможет вам .. Happy Coding:)

...