2011-05-16 42 views
0

基本上,我有这样的代码来解压缩一些字符串,在一个文件存储:的Java NIO和的FileInputStream

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?谢谢

回答

1

它不会有任何区别,至少不会太大。上次查看时,映射文件的I/O速度大约快20%。实际上你仍然必须做 I/O:映射只是保存一些数据拷贝。我会考虑将BUFFER_SIZE增加到至少32k。 cbuf也应该是这个方法中的一个局部变量,而不是一个成员变量,所以它将是线程安全的。可能值得而不是压缩文件在一定的大小阈值,比如说10k。

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

可能值得尝试在GZIPInputStream之上放置另一个BufferedInputStream,以及它下面的一个。让它一次做更多。