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

2024-01-06

我的 SQLite 数据库文件大小为 85MB,使用 XZ 格式压缩,大小已减小到 16MB。我使用以下代码(以及由Java 的 XZ http://tukaani.org/xz/java.html)在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 字节缓冲区进行大量写入。)


我能建议的最好的办法是分析你的代码,看看热点到底在哪里。但我怀疑你找不到任何可以改进到足以产生影响的东西。


我想选择 XZ,因为它在我的情况下具有最佳的压缩级别,这在一定程度上节省了下载时间...(使用 zip,解压缩该文件只需要大约 15 秒!

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Java中更快地解压缩XZ文件? 的相关文章

随机推荐