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

时间:2014-03-15 09:10:25

标签: java android compression zip 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。

我想知道我是否对代码做错了,或者有办法加速这个解压缩过程。

2 个答案:

答案 0 :(得分:2)

我认为你无法做到更快。如果将16Mb解压缩到85Mb需要2分钟,那么大部分时间都花在实际解压缩中,其余的很大一部分都在实际文件I / O中...物理层。

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


我建议的最好的方法是,您可以对代码进行分析,以了解热点的真实位置。但我怀疑你找不到任何可以改进的东西来发挥作用。


  

我想去XZ,因为它在我的情况下具有最好的压缩级别,这有点节省下载时间...(使用zip,解压缩此文件只需要大约15秒!

嗯,解压缩的额外CPU时间是使用压缩算法达到最大值所支付的价格。您需要确定哪个对您的用户更重要:更快的下载速度,或更快的数据库解压缩(安装?)。

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

答案 1 :(得分:1)

你应该做的最少的事情是将FileOutputStream包裹在BufferedOutputStream中,很少有你不应该使用BufferedInputStream / BufferedOutputStream的情况。试一试,看看现在需要多长时间。