我想知道清除概念差异的区别,因为我已经看到SocketChannel,FileChannel等类.与Socket和File I / O Streams相比
据我所知,I / O Streams必须按顺序访问,即它们是可以读写的字节序列.您还可以使用缓冲流来提高I / O的效率.
那么,与Streams相比,“频道”是一个全新的概念还是仅仅是Streams的包装器?
是的,如果我们说“Stream是一个字节序列”那么如果两者都不同,那么这个意义上的频道是什么?
解决方法:
根据特定类型,通道仍然表示可以顺序读取或写入的字节序列.您可以通过Channels类中的工厂方法在这些API之间进行转换,这表明存在关系.
但是NIO API解决了某些设计问题,这些问题无法通过重构旧的流类(以兼容的方式)来解决.例如.基本类型现在是接口,允许某些通道同时实现多种类型,如ReadableByteChannel和WritableByteChannel.此外,没有读取单个字节的方法,这是摆脱“你可以使用BufferedStream来提高效率”神话的好方法.如果缓冲区大小不足导致I / O性能瓶颈,则首先提供一个更大的缓冲区,而不是将流或通道包装到另一个缓冲区中,从而强制它在缓冲区之间复制所有数据.因此,没有BufferedChannel.
除了顺序访问之外,像FileChannel这样的某些实现提供了允许随机访问底层资源的其他方法.这样,您可以使用统一的接口,而不是处理完全不同的API,例如RandomAccessFile / InputStream / OutputStream关系.
此外,在引入NIO时添加了许多以前缺少的I / O功能.其中一些可以在没有问题的情况下在旧类上实现,但设计者显然倾向于为所有这些使用新API,从一开始就可以在设计中考虑这些功能.
但一般来说,如上所述,与流相比,渠道并不是一个全新的概念.
标签:java,io,stream,nio,channel
来源: https://codeday.me/bug/20190623/1266121.html