通道是否包装在IO流上?

时间:2017-02-08 12:04:39

标签: java io stream nio channel

我想知道清除概念差异的区别,因为我已经看到SocketChannelFileChannel等类。与Socket和文件I / O流

进行比较

据我所知,I / O Streams必须按顺序访问,即它们是可以读写的字节序列。您还可以使用缓冲流来提高I / O的效率。

那么,与Streams相比,“频道”是一个全新的概念还是仅仅是Streams的包装?

是的,如果我们说“Stream是一个字节序列”那么如果两者都不同,那么那个意义上的频道是什么?

1 个答案:

答案 0 :(得分:4)

都不是。通道不是流的包装器(除非您通过Channels.newChannel(InputStream)Channels.newChannel(OutputStream)明确包装流)并且它们不是“全新的概念”。

根据特定类型,通道仍然表示可以按顺序读取或写入的字节序列。您可以通过Channels类中的工厂方法在这些API之间进行转换,这表明存在关系。

但是NIO API解决了某些设计问题,这些问题无法通过重构旧的流类(以兼容的方式)来解决。例如。基本类型现在是接口,允许某些通道同时实现多种类型,如ReadableByteChannelWritableByteChannel。此外,没有读取单个字节的方法,这是摆脱“你可以使用BufferedStream来提高效率”神话的好方法。如果缓冲区大小不足导致I / O性能瓶颈,则首先提供一个更大的缓冲区,而不是将流或通道包装到另一个缓冲区中,从而强制它在缓冲区之间复制所有数据。因此,没有BufferedChannel

除了顺序访问之外,像FileChannel这样的某些实现提供了允许随机访问底层资源的其他方法。这样,您就可以使用统一的界面,而不是处理完全不同的API,例如RandomAccessFile / InputStream / OutputStream关系。

此外,在引入NIO时,添加了许多以前缺少的I / O功能。其中一些可以在没有问题的情况下在旧类上实现,但设计者显然倾向于为所有这些使用新的API,从一开始就可以在设计中考虑这些功能。

但总的来说,正如所说的那样,与流相比,渠道并不是一个全新的概念。