java - 如何在 Java 中更快地解压缩 XZ 文件?

标签 java android compression zip xz

我的大小为 85MB 的 SQLite 数据库文件使用 XZ 格式压缩,其大小已减小到 16MB。我使用以下代码(以及 XZ for Java 提供的 JAR)在 Android Jelly Bean 中解压它:

try { 
    FileInputStream fin = new FileInputStream(path + "myFile.xz");
    BufferedInputStream in = new BufferedInputStream(fin);
    FileOutputStream out = new FileOutputStream(des + "myDecompressed");
    XZInputStream xzIn = new XZInputStream(in);
    final byte[] buffer = new byte[8192];
    int n = 0;
    while (-1 != (n = xzIn.read(buffer))) {
        out.write(buffer, 0, n);
    } 
    out.close();
    xzIn.close();
}
catch(Exception e) { 
    Log.e("Decompress", "unzip", e); 
}

解压成功,但需要两分多钟才能完成。我认为这很长,因为压缩文件只有 16MB,未压缩文件只有 85MB。

我想知道我是否对代码做错了什么,或者有什么方法可以加快这个解压过程。

最佳答案

我认为您几乎无能为力使它更快。如果将 16Mb 解压缩到 85Mb 需要 2 分钟,那么很可能大部分时间都花在了实际解压缩上,其余大部分时间都花在了实际文件 I/O 上……在物理层面上。

当然,您的代码没有明显低效的地方。您正在使用 BufferedInputStream 读取并使用大缓冲区进行解码/写入。因此,您将高效地执行 I/O 系统调用。 (添加 BufferedOutputStream 不会产生任何影响,因为您已经在从 8192 字节缓冲区进行大量写入。)


我能建议的最好的方法是分析您的代码以查看热点的真实位置。但我怀疑您找不到任何可以改进到足以产生影响的东西。


I want to go for XZ because it has the best compression level in my case, which somewhat saves the downloading time... (with zip, the unzipping of this file takes only about 15 seconds!

好吧,额外的 CPU 解压时间是您使用压缩算法的最大代价。您需要决定哪个对您的用户更重要:更快的下载,还是更快的数据库解压(安装?)。

FWIW,ZIP 解压缩可能是在 native 库中实现的,而不是在纯 Java 中实现的。它当然适用于 Oracle/OpenJDK JVM。

关于java - 如何在 Java 中更快地解压缩 XZ 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22421805/

相关文章:

Java - 对象映射器 - 要列出的 JSON 数字数组 <Long>

android - Android 的 Google API 网址返回 ZERO_RESULTS

android - Firebase 实时数据库不会在发布 apk [Android] 中检索数据

linux - 多 cpu 核心 gzip 一个大文件

hadoop - 压缩RC表 hive

java - 将参数传递给按钮

java - 尝试连接 sphero 时发生错误

java - 我如何使用java代码以编程方式在android上运行cmd命令

java - 这个错误有什么解决办法吗?

c++ - 免费的基于 C/C++ 的 zip/zip64 库?