【问题标题】:What's the difference between BufferedInputStream and java.nio.Buffer?BufferedInputStream 和 java.nio.Buffer 有什么区别?
【发布时间】:2017-01-18 05:19:16
【问题描述】:

我们可以通过装饰FileInputStream 来获得BufferedInputStream。并且从FileInputStream.getChannel 获得的频道也可以将内容读入Buffer

那么,BufferedInputStreamjava.nio.Buffer 有什么区别?即,什么时候应该使用BufferedInputStream,什么时候应该使用java.nio.Bufferjava.nio.Channel

【问题讨论】:

  • 它们是两个完全不同的东西,它们的名字中恰好有“缓冲区”这个词。 BufferedInputStreamInputStream 并遵循该 API。 Buffer 是可访问的数据缓冲区。你有实际理由问这个问题吗?在这种情况下,陈述你遇到的实际问题比提出一个非常不清楚的问题更有成效。
  • 你能解释一下为什么They are two entirely different things吗?我只是想获得一些资源来学习BufferedInputStreamjava.nio.Buffer的原理。
  • Javadoc:BufferedInputStreamBuffer。事物不相关没有理由——事物相关只有原因。
  • 当然我已经阅读了 java 文档。但是我仍然不明白它们在实现机制上有何不同。你能解释一下我什么时候应该使用BufferedInputStream,什么时候应该使用java.nio.Bufferjava.nio.Channel
  • 不同之处在于它们并不相同,这里唯一感兴趣的问题是您为什么不这么认为,以及为什么您认为这里有任何问题需要回答。

标签: java buffer nio iostream fileinputstream


【解决方案1】:

Getting started with new I/O (NIO),文章摘录:

面向流的 I/O 系统一次处理一个字节的数据。一个 输入流产生一个字节的数据,输出流消耗 一字节数据。 为流数据创建过滤器非常容易。 将几个过滤器链接在一起也相对简单,这样 每个人都尽其所能,相当于一个单一的,复杂的 处理机制。另一方面,面向流的 I/O 通常是 相当慢

面向块的 I/O 系统以块的形式处理数据。每次操作 在一个步骤中生成或使用一个数据块。 通过以下方式处理数据 块可以比(流式处理)处理它快得多 字节。但是面向块的 I/O 缺乏一些优雅和简单 面向流的 I/O

【讨论】:

    【解决方案2】:

    这些类是在不同时间为不同的包编写的。

    如果您使用 java.io 包中的类,请使用 BufferedInputStream。

    如果您使用的是 java.nio,请使用 ByteBuffer。

    如果不使用任何一个,您可以使用纯字节[]。 ByteBuffer 有一些处理原语的有用方法,因此您可以使用它。

    这不太可能有任何混淆,因为通常你只会在必要时使用一个,在这种情况下只有一个会在你这样做时编译。

    【讨论】:

      【解决方案3】:

      我认为我们使用BufferedInputStream 来包装InputStream 使其像面向块一样工作。但是当处理太多数据时,它实际上比真正的面向块的 I/O (Channel) 消耗更多时间,但仍然比 unwrapperd InputStream 更快。

      【讨论】:

        猜你喜欢
        • 2012-05-13
        • 2010-10-02
        • 2011-12-12
        • 2010-09-16
        • 2012-03-14
        • 2012-02-06
        • 2011-02-25
        • 2011-11-22
        相关资源
        最近更新 更多