最近在整理 Java NIO 相关的资料,发现了 Jakob Jenkov 2014年写的 Java NIO Tutorial 教程,概念讲的非常透彻、浅显易懂,值得作为 Java NIO 学习的推荐材料。

具体参考文章会再文末注明出处。

阅读文章的过程中如果有任何疑问,欢迎添加笔者为好友,拉您进【七日书摘】微信交流群,一起交流技术,一起打造高质量的职场技术交流圈子,抱团取暖,共同进步。
七日书摘官方群.jpg

本系列会尽量保持和原英文版本一致的章节,因此会以小章节的方式发布该系列文章:

英文原文连接:http://tutorials.jenkov.com/java-nio/overview.html

Java NIO 概览

Java NIO 包含以下三个核心组件:

  1. 通道Channels
  2. 缓存Buffers
  3. 选择器Selectors

Java NIO 中的类和组件远多于以上列举的这三个,但在我看来 Channel,Buffer 和 Selector 构成了 API 的核心,其余组件像 Pipe 和 FileLock 只不过是为了配合三个核心组件而结合使用的工具类。因此在本节中会重点讲解这个三个核心组件,其他组件将会在本教程中其他各章节中分别介绍。

通道和缓冲区(Channels and Buffers)

通常来说 NIO 中的所有 IO 都需要使用 Channel 的,一个 Channel 像一个字节流;Channel 可以从 Channel 中把数据写到 Buffer 中,也可以把缓冲区 Buffer 的数据写入到 Channel 中,请看如下图例:
overview-channels-buffers.png
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 的图例:
overview-selectors.png
Java NIO: A Thread uses a Selector to handle 3 Channel's

当你使用选择器(Selector) 时,你必须先把通道(Channel)注册到选择器(Selector) 上,注册后就可以调用选择器(Selector) 的 select() 方法。这个方法将会进入阻塞直到有一个通道(Channel) 的状态符合条件/事件达到,当方法返回时,线程可以处理该事件。例如:连接到达,数据到达。

------完------

推荐阅读:

Java基础知识面试题篇(2020年2月最新版)

更技术学习请进入七日书摘官方群: 七日书摘官方群

七日书摘官方群群聊二维码.png

参考资源:
https://blog.csdn.net/u013857458/article/details/82424104
https://blog.csdn.net/weixin_34066347/article/details/88022884
https://juejin.im/post/5bbe1c116fb9a05d2f36cf16