程序员潇然 发表于 2022-10-31 17:57:16

NIO Channel 概述 类结构层次分析 (六)

本文主要介绍Java NIO中 的Channel类。

通道底层可以理解为封装了一个底层的文件描述符,例如硬件设备、文件、网络连接等。

对于java中的NIO编程来说,只需要对Channel进行管理操作即可,进而借助于Buffer对自己真正关心的数据进行操作。

### 核心使用

1. 我需要获取一个Channel,这个Channel是绑定到xxx上的(文件、网络等)
2. Channel关注的事件注册在Selector上,在对事件安排分工后,静待事件的到来
3. 事件到来后,对Buffer进行操作,完成数据操作

### 类结构图

!(data/attachment/forum/202210/31/190934wyyo2w9bphgygpht.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

io必然围绕着读写,所以整个channel的核心也就是读写。

看下方法列表一目了然,核心就是 `read`和 `write`

channel的抽象模型是指向文件描述符的一个通道,所以也会有 `open`和 `close` 的概念

还有网络相关的 `bind`

额外的还有阻塞、中断以及Selector 注册相关的

图片上右键新标签打开查看大图

!(data/attachment/forum/202210/31/191621zufd6tsdd6p6ndbd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

**所有的read以及write方法,参数均与ByteBuffer 相关。**

### Channel

!(data/attachment/forum/202210/31/193155gfm1yyhk11mzhmu1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

译文如下:

I/O操作的连接。
通道表示与实体的一个打开的连接,例如硬件设备、文件、网络套接字或能够执行一个或多个不同I/O操作(例如读取或写入)的程序组件。

通道要么是打开的,要么是关闭的。
通道在创建时打开,一旦关闭,它将保持关闭状态。

一旦通道关闭,任何对其调用I/O操作的尝试都将引发ClosedChannelException。

可以通过调用其isOpen方法来测试通道是否打开。

**一般来说,Channel对于多线程访问是安全的,如扩展和实现该接口的接口和类的规范中所述。**

!(data/attachment/forum/202210/31/194050vzrit0nd6ztrpew8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

1.Java NIO 支持面向字节流的数据读写方式,数据从 ByteBuffer 读取后写到 Channel 中,或者从 Channel 中读取后写入 ByteBuffer 中。
2.Java NIO Channel 支持字节流读写双向操作,一个处于 Open 状态的 Channel,既可以进行读操作、也可以进行写操作。
3.Java NIO Channel 支持阻塞和非阻塞两种模式。
4.Java NIO Channel 是线程安全的。

务必记住,Channel是线程安全线程安全的,所以实际编码中,少了很多后顾之忧和麻烦。

### Channel设计拆解!(data/attachment/forum/202210/31/200256oziolzhxjzllz3ap.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

对于最上面,应用层面的Channel,又可以简单地分为两类

!(data/attachment/forum/202210/31/201051ph88y6o85pw5ha7i.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

当然,Channel体系不仅仅只有这几个,但是列出来的这几个是比较核心的

比如,网络相关的 `NetworkChannel `并没有在结构图中标识出来,不要以为Channel就只有那几个类

详细可以直接查看包内的类列表

!(data/attachment/forum/202210/31/200420na7zyw39mv303z8a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

比如还有广播

!(data/attachment/forum/202210/31/204503zeigeq9q4i8ebmmb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

### 小结

Channel面向字节,对于底层文件描述符的一种映射。

对于Channel,应用层面主要就是文件以及网络,与他们交互的实体是Buffer,稍后介绍。

核心功能就是围绕着通道的读写。

按照应用的需要有分为了文件以及网络,绝大多数功能都是围绕他们展开的。

核心功能如下:

!(data/attachment/forum/202210/31/205457v66okojco6h7x65g.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

!(data/attachment/forum/202206/16/141330jha7st9soow8772i.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "common_log.png")
`转载务必注明出处:程序员潇然,疯狂的字节X,https://crazybytex.com/thread-207-1-1.html `
页: [1]
查看完整版本: NIO Channel 概述 类结构层次分析 (六)