基本上,我有以下代码来解压缩一些存储在文件中的字符串:

public static String decompressRawText(File inFile) {
    InputStream in = null;
    InputStreamReader isr = null;
    StringBuilder sb = new StringBuilder(STRING_SIZE);
    try {
        in = new FileInputStream(inFile);
        in = new BufferedInputStream(in, BUFFER_SIZE);
        in = new GZIPInputStream(in, BUFFER_SIZE);
        isr = new InputStreamReader(in);
        int length = 0;
        while ((length = isr.read(cbuf)) != -1) {
            sb.append(cbuf, 0, length);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            in.close();
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }
    return sb.toString();
}


由于物理IO非常耗时,并且文件的压缩版本都非常小(文本2M到2K左右),我是否仍然可以执行上述操作,但是在已经映射到内存的文件上呢?可能使用Java NIO?谢谢

最佳答案

不会有任何变化,至少不会有太大变化。上次查看时,映射文件的I / O速度提高了约20%。您仍然必须实际执行I / O:映射仅保存一些数据复制。我会考虑将BUFFER_SIZE增加到至少32k。同样,cbuf的大小在此方法中应为局部变量,而不是成员变量,因此它将是线程安全的。可能不值得在一定大小阈值(例如10k)下压缩文件。

另外,您应该在此处关闭isr,而不是in

可能值得尝试将另一个BufferedInputStream及其下面的BufferedInputStream放在GZIPInputStream的顶部。让它一次执行更多操作。

10-08 12:50