【Java网络编程】NIO核心组件介绍

84 阅读1分钟

在上一篇文章中介绍到了Java阻塞式IO的缺点,并且给出了解决方案——非阻塞式IO,也就是所谓的NIO。

在这里要补充一个知识点:IO通常包含两种,一种是文件IO,一种是网络IO。

基于上面的小知识点,我们需要分两个层面去介绍NIO的核心组件:

  • 文件NIO,Channel和Buffer
  • 网络NIO,Selector、Channel和Buffer

由此,本文介绍的顺序依次为:Channel、Buffer、Selector

Channel

在阻塞式IO中,使用Stream来读入数据和写出数据。但是在NIO体系中,Channel被用来读入数据和写出数据。

相较于Stream而言,Channel的主要区别在于不区分方向,无论是读还是写,都是用同一个Channel,而不是像Stream一样有InputChannel和OutputChannel。

Channel是一个接口,常见的实现类有如下一些:

  • FileChannel
  • SocketChannel
  • ServerSocketChannel

Buffer

Buffer是用于缓存数据的,用于从Channel中读取数据或者向Channel中写入数据。看到这里,你可能会有些疑惑:Buffer好像多余了?为什么不直接用Channel?

我个人认为这里可以用职责单一设计原则来解释,也就是Channel只负责接收输入的数据和向外输出数据,而Buffer则是负责分批缓存数据,便于后续写入Channel或被序列化为程序数据。【等有更好的理解时再来补充】

Buffer是一个抽象类,它的子抽象类是ByteBuffer,而ByteBuffer有如下一些实现类:

  • HeapByteBuffer
  • MappedByteBuffer

Selector