一、什么是通道(Channel):
1、通道(Channel)一般用于表示源节点与目标节点的连接。在 JAVA NIO中负责缓冲区中数据的传输。
2、通道(Channel)本身不存储数据,因此需要配合缓冲区进行传输。

3、最初的操作系统中我们应用程序调用计算机底层的IO接口时,所有的请求都要交给CPU来处理,所有的IO操作都是交给CPU来独立负责的。
这样进行大量读写操作时,对于CPU的占用率会变得特别高。

4、后面的操作系统经过改进,在内存与IO接口中间弄了一个DMA(直接存储器),这时我们应用程序向操作系统发起读写的IO请求时,
DMA(直接存储器)会向CPU申请权限,申请下来权限后,这些IO操作都交给DMA(直接存储器)全权负责。这样的好处是,
CPU在进行读写请求的过程中,CPU不再需要进行干预了。 传统的数据传输方式就是这种DMA(直接存储器),也就是我们所说的IO流就是这种形式。
但是仍然还是有一个问题,如果我们应用程序发起大量的读写请求时,这时候DMA(直接存储器)也会去向CPU申请权限,然后去建立很多个DMA总线,
这时如果DMA总线过多,就会造成一个总线冲突的问题。如果总线冲突也会十分的影响性能。

5、后来DMA(直接存储器)也有了更新,更新成了Channel(通道)的形式,当然DMA还是存在的。通道是一个完全独立的处理器,
专门用于IO操作,虽然他是处理器,但是仍然是附属于CPU,相较于原来的DMA(直接存储器)他是完全独立的处理器,
拥有一套自己的命令 。这时如果从应用程序来了大量的IO请求,它也不再需要去向CPU申请了,也就是让IO操作与CPU彻底的断绝关系了。
二、通道(Channel)的主要实现类有哪些:
java.nio.channels.Channel 接口:
|-- FileChannel
|-- SocketChannel
|-- ServerSocketChannel
|-- DatagramChannel
三、如何获取通道(Channel):
1、Java 针对支持通道的类提供了 getChannel() 方法:
本地IO:
(1) FileInputStream
(2) FileOutputStream
(3) RandomAccessFile
网络IO:
(1) Socket
(2) ServerSocket
(3) DatagramSocket
2、在JDK 1.7以上版本中的 NIO.2 针对各个通道提供了静态方法open() 。
3、在JDK 1.7以上版本中的 NIO.2 的Files 工具类的 newByteChannel() 。
随笔笔记整理于尚硅谷视频。视频地址:https://www.bilibili.com/video/BV14W411u7ro