【问题标题】:Inflate output to file performance improvement将输出膨胀到文件性能改进
【发布时间】:2017-03-19 13:49:21
【问题描述】:

我正在遵循类似于下面的代码。环顾不同的实现,似乎大多数人通过执行字节复制来执行相同的操作。是否有更快的方法来处理从文件膨胀并打印回文件?

public static String unzipString(InputStream in) {
try {
    int length = (int) in.readUBits( 16 );
    // Add extra byte to array when Inflater is set to true
    byte[] data = in.read( length );

    ByteArrayInputStream bin = new ByteArrayInputStream(input);
    InflaterInputStream in = new InflaterInputStream(bin);
    FileoutputStream bout = new FileoutputStream(this.file);
    int b;
    while ((b = in.read()) != -1) {
        bout.write(b);
    }
    bout.close();

} catch (IOException io) {
    return null;
}

}

【问题讨论】:

  • 您的代码看起来很别扭。我想知道它是否会编译。
  • 这不是我的代码。这是我从谷歌中提取的一个例子。与上面给出的按字节写入的输出类似。我的文件很大,每个文件似乎需要 2 分钟才能写入,其中每个压缩文件为 1600KB,未压缩文件为 26MB。写入字节的输出流似乎是帐篷里的长杆。
  • 该代码非常糟糕。您应该尝试另一个示例。我无法改善已经倒塌的房子。
  • 很公平。有没有一种简单的解决方案,使用 Inflate 对压缩文件进行充气而不需要手动字节复制?
  • 我猜不是。只要是纯Java,就得做字节拷贝。即使它看起来避免直接字节复制,它实际上在你没有注意到的地方使用它。唯一的改进是使用缓冲区复制多个字节,通常大小为几千字节,而不是一次复制一个

标签: java compression inflate


【解决方案1】:

一次复制一个字节始终是处理文件的一种非常慢的方法。我建议您改用 8 KB 的缓冲区。

try (FileOutputStream fout = new FileOutputStream(this.file)) {
    byte[] bytes = new byte[8192];
    for (int len; (len = in.read(bytes)) != -1;)
        fout.write(b, 0, len);
}

顺便说一句,为了使其更快,您可以避免首先使用包装 in 但准确读取 length 字节的 InputStream 复制 byte[]。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    相关资源
    最近更新 更多