基本上,我有以下代码来解压缩一些存储在文件中的字符串:
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的顶部。让它一次执行更多操作。