最近在整理 Java NIO 相关的资料,发现了 Jakob Jenkov 2014年写的 Java NIO Tutorial 教程,概念讲的非常透彻、浅显易懂,值得作为 Java NIO 学习的推荐材料。
具体参考文章会再文末注明出处。
阅读文章的过程中如果有任何疑问,欢迎添加笔者为好友,拉您进【七日书摘】微信交流群,一起交流技术,一起打造高质量的职场技术交流圈子,抱团取暖,共同进步。
本系列会尽量保持和原英文版本一致的章节,因此会以小章节的方式发布该系列文章:
Java NIO 概览
Java NIO 包含以下三个核心组件:
- 通道Channels
- 缓存Buffers
- 选择器Selectors
Java NIO 中的类和组件远多于以上列举的这三个,但在我看来 Channel,Buffer 和 Selector 构成了 API 的核心,其余组件像 Pipe 和 FileLock 只不过是为了配合三个核心组件而结合使用的工具类。因此在本节中会重点讲解这个三个核心组件,其他组件将会在本教程中其他各章节中分别介绍。
通道和缓冲区(Channels and Buffers)
通常来说 NIO 中的所有 IO 都需要使用 Channel 的,一个 Channel 像一个字节流;Channel 可以从 Channel 中把数据写到 Buffer 中,也可以把缓冲区 Buffer 的数据写入到 Channel 中,请看如下图例:
Java NIO: Channels read data into Buffers, and Buffers write data into Channels
下面列举的是通道和缓冲区(Channel,Buffer)类型中的主要实现类:
- FileChannel(文件IO)
- DatagramChannel(UDP)
- SocketChannel(TCP)
- ServerSocketChannel(网络IO)
正如你所看到的,上面通道(Channel)包含了 UDP、TCP、网络 IO以及文件IO。
和这些类一起的还有其他一些比较有趣的接口,在本节中暂时不多介绍。为了简洁起见,我们会在必要的时候引入这些概念。下面是核心的缓冲区(Buffer)实现类的列表:
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
上面这些缓冲区(Buffer)涵盖了可以通过 IO 操作的基础类型:byte、short、int、long、float、double 以及characters。NIO 实际上还提供一种 MappedBytesBuffer,一般用于和内存映射的文件,常用于大文件处理。
选择器(Selectors)
选择器允许单线程操作多个通道,如果你的应用程序中有非常多的数据量小的链接,这个特性将会非常有帮助。比如即时通讯服务。
下面是一个单线程中 Slector 维护 3 个 Channel 的图例:
Java NIO: A Thread uses a Selector to handle 3 Channel's
当你使用选择器(Selector) 时,你必须先把通道(Channel)注册到选择器(Selector) 上,注册后就可以调用选择器(Selector) 的 select() 方法。这个方法将会进入阻塞直到有一个通道(Channel) 的状态符合条件/事件达到,当方法返回时,线程可以处理该事件。例如:连接到达,数据到达。
------完------
推荐阅读:
参考资源:
https://blog.csdn.net/u013857458/article/details/82424104
https://blog.csdn.net/weixin_34066347/article/details/88022884
https://juejin.im/post/5bbe1c116fb9a05d2f36cf16