本文主要介绍Java NIO中 的Channel类。
通道底层可以理解为封装了一个底层的文件描述符,例如硬件设备、文件、网络连接等。
对于java中的NIO编程来说,只需要对Channel进行管理操作即可,进而借助于Buffer对自己真正关心的数据进行操作。
核心使用
- 我需要获取一个Channel,这个Channel是绑定到xxx上的(文件、网络等)
- Channel关注的事件注册在Selector上,在对事件安排分工后,静待事件的到来
- 事件到来后,对Buffer进行操作,完成数据操作
类结构图
io必然围绕着读写,所以整个channel的核心也就是读写。
看下方法列表一目了然,核心就是 read
和 write
channel的抽象模型是指向文件描述符的一个通道,所以也会有 open
和 close
的概念
还有网络相关的 bind
额外的还有阻塞、中断以及Selector 注册相关的
图片上右键新标签打开查看大图
所有的read以及write方法,参数均与ByteBuffer 相关。
Channel
译文如下:
I/O操作的连接。
通道表示与实体的一个打开的连接,例如硬件设备、文件、网络套接字或能够执行一个或多个不同I/O操作(例如读取或写入)的程序组件。
通道要么是打开的,要么是关闭的。
通道在创建时打开,一旦关闭,它将保持关闭状态。
一旦通道关闭,任何对其调用I/O操作的尝试都将引发ClosedChannelException。
可以通过调用其isOpen方法来测试通道是否打开。
一般来说,Channel对于多线程访问是安全的,如扩展和实现该接口的接口和类的规范中所述。
1.Java NIO 支持面向字节流的数据读写方式,数据从 ByteBuffer 读取后写到 Channel 中,或者从 Channel 中读取后写入 ByteBuffer 中。
2.Java NIO Channel 支持字节流读写双向操作,一个处于 Open 状态的 Channel,既可以进行读操作、也可以进行写操作。
3.Java NIO Channel 支持阻塞和非阻塞两种模式。
4.Java NIO Channel 是线程安全的。
务必记住,Channel是线程安全线程安全的,所以实际编码中,少了很多后顾之忧和麻烦。
Channel设计拆解
对于最上面,应用层面的Channel,又可以简单地分为两类
当然,Channel体系不仅仅只有这几个,但是列出来的这几个是比较核心的
比如,网络相关的 NetworkChannel
并没有在结构图中标识出来,不要以为Channel就只有那几个类
详细可以直接查看包内的类列表
比如还有广播
小结
Channel面向字节,对于底层文件描述符的一种映射。
对于Channel,应用层面主要就是文件以及网络,与他们交互的实体是Buffer,稍后介绍。
核心功能就是围绕着通道的读写。
按照应用的需要有分为了文件以及网络,绝大多数功能都是围绕他们展开的。
核心功能如下:
转载务必注明出处:程序员潇然,疯狂的字节X,https://crazybytex.com/thread-207-1-1.html