BufferedInputStream和java.nio.Buffer有什么区别?

7
我们可以通过使用FileInputStream进行装饰从而获得一个BufferedInputStream。从FileInputStream.getChannel获取的通道也可以将内容读取到缓冲区中。
那么,BufferedInputStreamjava.nio.Buffer之间有什么区别呢? 换句话说,什么时候应该使用BufferedInputStream,什么时候应该使用java.nio.Bufferjava.nio.Channel呢?

3
它们是两个完全不同的事物,只是它们的名称中都有“Buffer”一词。 BufferedInputStream 是一个 InputStream 并遵循该 API。而且 Buffer 是可访问的数据缓冲区。你是否有实际的原因来询问这个问题?如果是这种情况,比起问一个非常不清楚的问题,更有成果的做法是说明你实际遇到的问题。 - Erwin Bolwidt
你能解释一下为什么 它们是两个完全不同的东西 吗?我只想获取一些学习 BufferedInputStreamjava.nio.Buffer 原理的资源。 - expoter
2
Javadoc: BufferedInputStreamBuffer。事物之间不存在无关联的原因,只有它们相关的原因。 - Erwin Bolwidt
当然我已经阅读了Java文档。但是我仍然不理解它们在实现机制上的区别。你能否解释一下何时应该使用BufferedInputStream,何时应该使用java.nio.Bufferjava.nio.Channel - expoter
它们的区别在于它们不同,而这里唯一有趣的问题是为什么你认为它们相同,以及为什么你认为这里有任何需要回答的问题。 - user207421
3个回答

3

新I/O(NIO)入门,选自一篇文章:

基于流的I/O系统逐字节处理数据。输入流产生一个字节的数据,输出流消费一个字节的数据。非常容易为流式数据创建过滤器。也相对简单地将多个过滤器链接在一起,以便每个过滤器在单个复杂处理机制中发挥其作用。但是,基于流的I/O通常速度较慢

基于块的I/O系统按块处理数据。每次操作一步生成或消耗一个数据块。通过按块处理数据可以比按(流式)字节处理数据更快。但是,基于块的I/O缺乏基于流的I/O的一些优雅和简洁


1

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

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

如果您正在使用java.nio,请使用ByteBuffer。

如果您没有使用任何一个,您可以使用普通的byte[]。 ByteBuffer有一些有用的方法来处理原始数据类型,因此您可能会用它来处理这些数据。

通常不会有任何混淆,因为一般情况下只有在必须使用时才会使用其中之一,在这种情况下,只有一个编译时才能使用。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接