java nio 和 FileInputStream

标签 java performance gzip nio

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

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/

相关文章:

java - 一致性和容器管理的事务

asp.net - 用于实时监控 ASP.NET Web 应用程序的工具和方法?

google-app-engine - 如何在 Google App Engine 上获取 gzip 或 brotli 编码

networking - 如何使用Wireshark查看源页面?

java - 文件到字节数组

java - 如何在 EventHandler 中使用 FXMLLoader?

java - 如何使用 izpack 将我的 jar 应用程序制作为安装程序?

sql-server - 始终在数据库表上定义聚集索引是个好主意吗?

c# - 通过编写 C dll 来加速 C# 中的数学代码?

c - 如何在 C 中顺序解析 gzip 压缩的文本文件而不先完全解压缩