在上一篇文章中介绍到了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