【问题标题】:DataOutputStream() VS DataOutputStream(new BufferedOutputStream())DataOutputStream() VS DataOutputStream(new BufferedOutputStream())
【发布时间】:2011-11-13 05:14:53
【问题描述】:

Java Tutorials 处的代码显示了使用DataOutputStream 类和DataInputStream 类的示例。

代码的 sn-p 如下所示:

//..
out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(dataFile)));
//..
in = new DataInputStream(new BufferedInputStream(new FileInputStream(dataFile)));
//..

我想知道为什么当我们创建一个新的DataOutputStream 时需要创建一个新的BufferedOutputStream

这不是多余的吗? :new DataOutputStream(new FileOutputStream(dataFile));

正如this page 声称的那样,DataStreams 已经提供了缓冲文件输出字节流。那么“双缓冲”真的需要吗?

我修改了 2 行代码(输出和输入),去掉了 BufferedOutputStreamBufferedInputStream,一切似乎都运行良好,所以我想知道 BufferedOutputStreamBufferedInputStream?

【问题讨论】:

    标签: java io


    【解决方案1】:

    将 FileOutputStream 包装在 BufferedOutputStream 中通常会加快程序的整体输出速度。只有在写入大量数据时才会注意到这一点。将 InputStream 包装在 BufferedInputStream 中也是如此。使用缓冲区只会影响效率,不会影响正确性。

    【讨论】:

    • 嘿,我不明白缓冲区的影响,但是这个页面 (download.oracle.com/javase/tutorial/essential/io/…) 声称 DataStreams 已经提供了缓冲文件输出字节流,那么BufferedOutputStream 的目的是什么?跨度>
    • @Pacerier - 该页面的措辞非常糟糕。查看 DataOutputStream 的源代码表明它不做任何内部缓冲(除了将字符串转换为修改后的 UTF8 格式时)。 DataInputStream 也是如此。
    • BufferedOutputStream 为我创造了奇迹!
    • 不要低估缓冲可以产生多大的影响。只需将 BufferedOutputStream 添加到我的代码中,就可以将一次写入 300 万个浮点数的循环从 95 秒的操作变为 0.5 秒的操作——速度提高了近 200 倍!
    【解决方案2】:

    我以前认为 Java IO 模型不必要地大,但现在我真的“明白”了,我觉得它很优雅。 BufferedOutputStream 是装饰器模式的一个实现(谷歌它......它很有用)。这意味着 BufferedOutputStream 只是将功能添加到它包装的输出流中。在内部,BufferedOutputStream 调用它所装饰的任何 OutputStream。

    【讨论】:

      【解决方案3】:

      这不是多余的,只是不同而已。 Buffered 变体添加了一个缓冲层,通过批量读取和写入来加速 IO 操作。

      不是每次读/写都进入磁盘,而是先进入内存。它有多大的不同取决于多种因素。操作系统和/或磁盘 I/O 系统也可能会进行一些缓冲。

      【讨论】:

      • 我不明白的是DataStreams已经提供了缓冲文件输出字节流。那么为什么我们需要在它之间提供另一个 BufferedOutputStream 呢?
      • 缓冲的输出蒸汽是什么缓冲。
      【解决方案4】:

      缓冲 IO 流可帮助您批量读取,从而显着降低 IO 成本。 IO操作相当昂贵。想象一下,您的应用程序对读/写的每个字节执行完整的读/写周期,而不是一次读/写一大块数据。进行缓冲读/写绝对是非常有效的。如果您在这两种情况下收集一些性能统计信息,您会注意到效率的巨大差异,即 w 和 w/o 缓冲 IO,特别是在读取/写入大量数据时。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-22
        • 1970-01-01
        • 2013-03-12
        • 2012-03-23
        • 2013-09-03
        • 2012-09-23
        • 1970-01-01
        相关资源
        最近更新 更多