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

我的SQLite db文件大小为85MB,使用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解压缩可能在本机库中实现,而不是在纯Java中实现.它肯定适用于Oracle / OpenJDK JVM.

上一篇:Python:打开一个压缩的SQLite数据库


下一篇:WebSocket渗透 – 放气C#