我需要在 android 中解压缩一个 2.5mb 的 .zip 文件(1087 个文件 - *.html、*.css 和 *.db),我使用了 java.util.zip,它工作正常,但我需要提高性能,解压缩过程持续 1.10 分钟,我需要减少这个时间。我遵循了一些提高性能的建议,例如:
- 使用 BufferedInputStream、FileOutputStream 和 BufferedOutputStream。
- 阅读块中的 zip:
字节数据[] = 新字节[2048];while ((counter = bisMediaFile.read(data, 0, 2048)) != -1) { bosMediaFile.write(data, 0, counter); }
有什么办法可以改进我的代码吗?我正在搜索第三方 zip 程序以编程方式使用,例如我尝试了 7ZipJBinding,但看起来 android 不支持这个,因为我引用了 Sevenzipjbinding.jar 和 Sevenzipjbinding-AllPlatforms.jar 但我得到一个错误:“Native在 Sevenzipjbinding-AllPlatforms 中检测到的库”。在 7zip 主页上有 MAC、Windows、Linux 的版本,但我没有看到任何关于 android 的信息。您能否推荐任何其他库来解压缩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();
}
}