java是IO流上的通道包装器吗?
我想知道这个区别,以澄清概念上的区别,因为我已经看到了SocketChannel
,FileChannel
等类。与Socket
和文件I/O流相比
正如我所知,I/O流必须按顺序访问,也就是说,它们是可以读写的字节序列。您还可以使用缓冲流来提高I/O的效率
那么,与流相比,“通道”是一个全新的概念,还是仅仅是流的包装器
是的,如果我们说“流是一个字节序列”,那么在这个意义上,如果两者都不同,那么通道是什么呢
你可以在下面搜索框中键入要查询的问题!
我想知道这个区别,以澄清概念上的区别,因为我已经看到了SocketChannel
,FileChannel
等类。与Socket
和文件I/O流相比
正如我所知,I/O流必须按顺序访问,也就是说,它们是可以读写的字节序列。您还可以使用缓冲流来提高I/O的效率
那么,与流相比,“通道”是一个全新的概念,还是仅仅是流的包装器
是的,如果我们说“流是一个字节序列”,那么在这个意义上,如果两者都不同,那么通道是什么呢
# 1 楼答案
都不是。通道不是围绕流的包装器(除非通过^{} 或^{} 显式包装流),它们不是“全新概念”
根据特定类型,通道仍然表示可以顺序读取或写入的字节序列。您可以通过
Channels
类中的工厂方法在这些API之间进行转换,这表明存在一种关系但是NIOAPI解决了某些设计问题,这些问题无法通过重构旧的流类(以兼容的方式)来解决。例如,基本类型现在是接口,它允许某些通道同时实现多种类型,如
ReadableByteChannel
和WritableByteChannel
。此外,没有读取单个字节的方法,这是摆脱“可以使用BufferedStream提高效率”神话的好方法。如果缓冲区大小不足是造成I/O性能瓶颈的原因,那么可以首先提供一个更大的缓冲区,而不是将一个流或通道包装到另一个流或通道中,强制它在缓冲区之间复制所有数据,从而解决这个问题。因此,没有BufferedChannel
某些实现,比如
FileChannel
,除了顺序访问之外,还提供了额外的方法,允许对底层资源进行随机访问。这样,就可以使用统一的接口,而不是处理完全不同的API,比如RandomAccessFile
/InputStream
/OutputStream
关系此外,在引入NIO时,添加了许多以前缺失的I/O特性。其中一些可以在旧类的基础上实现,没有问题,但设计师显然倾向于为所有这些类使用新的API,在设计中可以从一开始就考虑这些特性
但总的来说,如前所述,与流相比,频道并不是一个全新的概念