Мне нужно разархивировать файл .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();
}
}