基本上我有这个代码来解压缩存储在文件中的一些字符串:
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 非常耗时,而且我的压缩版本的文件都非常小(大约 2K 到 2M 文本),我是否仍然可以执行上述操作,但在已经映射的文件上内存?可能使用java NIO?谢谢
最佳答案
不会有任何区别,至少不会有太大区别。我上次查看时,映射文件的 I/O 速度大约快了 20%。您仍然需要实际执行 I/O:映射只是节省一些数据复制。我会考虑将 BUFFER_SIZE
增加到至少 32k。还有cbuf的大小,它应该是这个方法中的局部变量,而不是成员变量,所以它将是线程安全的。将文件压缩到某个大小阈值(例如 10k)以下可能值得不。
此外,您应该在此处关闭 isr
,而不是 in
。
可能值得尝试将另一个 BufferedInputStream 放在 GZIPInputStream 的顶部及其下面。让它一次完成更多任务。
关于java nio 和 FileInputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6012885/