Распаковка файлов быстрее, чем с помощью java.util.zip в Android

Мне нужно разархивировать файл .zip размером 2,5 МБ (1087 файлов - *.html, *.css и *.db) в Android, я использовал java.util.zip, он отлично работает, но мне нужно улучшить производительность, процесс распаковки длится 1,10 минуты, мне нужно сократить это время. Я выполнил некоторые рекомендации по улучшению производительности, например:

  • Используйте BufferedInputStream, FileOutputStream и BufferedOutputStream.
  • Прочитайте zip блоками:

байт данных [] = новый байт [2048]; while ((счетчик = bisMediaFile.read(данные, 0, 2048)) != -1) { bosMediaFile.write(данные, 0, счетчик); }

Есть ли способ улучшить мой код? Я искал сторонние zip-программы для программного использования, например, я пробовал 7ZipJBinding, но похоже, что Android не поддерживает это, потому что я ссылался на sevenzipjbinding.jar и sevenzipjbinding-AllPlatforms.jar, но я получаю сообщение об ошибке: «Родной Библиотеки, обнаруженные в файле sevenzipjbinding-AllPlatforms". На домашней странице 7zip есть версии для MAC, Windows, Linux, но я ничего не видел про андроид. Не могли бы вы порекомендовать какую-либо другую библиотеку для распаковки файлов в Android?

Это мой весь код:

public static void processZipFile(String strBinaryPath,String strExtractPath, String strDestinationDBPath) throws Exception
{
    ZipFile zipInFile = null;
    try
    {
        if (strExtractPath != null)
        {
            zipInFile = new ZipFile(strBinaryPath);
            for (Enumeration<? extends ZipEntry> entries = zipInFile.entries(); entries.hasMoreElements();)
            {
                ZipEntry zipMediaEntry = entries.nextElement();
                if (zipMediaEntry.isDirectory())
                {
                    File mediaDir = new File(String.format("%s\\%s", strExtractPath, zipMediaEntry.getName()));
                    mediaDir.mkdirs();
                }
                else
                {
                        BufferedInputStream bisMediaFile = null;
                        FileOutputStream fosMediaFile = null; 
                        BufferedOutputStream bosMediaFile = null;
                        try
                        {
                                String strFileName = String.format("%s\\%s", strExtractPath, zipMediaEntry.getName());
                                File uncompressDir = new File(strFileName).getParentFile();
                                uncompressDir.mkdirs();

                                //if is a database file, extract to other path : android.movinginteractive.com/databases
                                if(strFileName.contains(".db"))
                                    strFileName = String.format("%s\\%s", strDestinationDBPath, ExtractDBName(zipMediaEntry.getName()));

                                bisMediaFile = new BufferedInputStream(zipInFile.getInputStream(zipMediaEntry));
                                fosMediaFile = new FileOutputStream(strFileName);
                                bosMediaFile = new BufferedOutputStream(fosMediaFile);

                                int counter;
                                byte data[] = new byte[2048];

                                while ((counter = bisMediaFile.read(data, 0, 2048)) != -1) 
                                {
                                    bosMediaFile.write(data, 0, counter);
                                }
                        }
                        catch (Exception ex)
                        {
                            throw ex;
                        }
                        finally
                        {
                            if (bosMediaFile != null)
                            {
                                bosMediaFile.flush();
                                bosMediaFile.close();
                            }
                            if (bisMediaFile != null)
                                bisMediaFile.close();
                        }
                }
            }


        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {
        if (zipInFile != null)
            zipInFile.close();
        File flZipToDelete = new File(strBinaryPath);
        if(flZipToDelete.exists())
            flZipToDelete.delete();

    }
}

person Jhon    schedule 16.02.2011    source источник
comment
Вы должны профилировать/время вашего кода, чтобы увидеть, где тратится время. Вы можете использовать распаковку 7zip или Info-ZIP в качестве эталона, чтобы увидеть, насколько быстро должна быть реализована разумная реализация.   -  person typo.pl    schedule 16.02.2011
comment
1087 много файлов, может в этом проблема? также, вы пробовали с большим буфером?   -  person bigstones    schedule 16.02.2011
comment
Хорошо, спасибо, я попробую предложения и после того, как я прокомментирую это. Большое Вам спасибо   -  person Jhon    schedule 16.02.2011
comment
В качестве теста вы также можете попробовать разархивировать файл того же размера, который содержит только один файл. Это скажет вам, если проблема заключается в количестве записываемых небольших файлов.   -  person dave.c    schedule 16.02.2011
comment
Пожалуйста, проверьте мой этот код, возможно, он будет вам полезен. stackoverflow.com/a/46218795/3962677   -  person Kamlesh    schedule 27.06.2018


Ответы (1)


Я уверен, что вы можете найти фрагмент кода C или C++ для распаковки файлов и запустить его через Android NDK. Тем не менее, я не уверен, какой прирост производительности вы можете получить.

person Bryan Stern    schedule 17.02.2011