有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是IO流上的通道包装器吗?

我想知道这个区别,以澄清概念上的区别,因为我已经看到了SocketChannelFileChannel等类。与Socket和文件I/O流相比

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

那么,与流相比,“通道”是一个全新的概念,还是仅仅是流的包装器

是的,如果我们说“流是一个字节序列”,那么在这个意义上,如果两者都不同,那么通道是什么呢


共 (1) 个答案

  1. # 1 楼答案

    都不是。通道不是围绕流的包装器(除非通过^{}^{}显式包装流),它们不是“全新概念”

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

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

    某些实现,比如FileChannel,除了顺序访问之外,还提供了额外的方法,允许对底层资源进行随机访问。这样,就可以使用统一的接口,而不是处理完全不同的API,比如RandomAccessFile/InputStream/OutputStream关系

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

    但总的来说,如前所述,与流相比,频道并不是一个全新的概念