Java NIO包括以下几个核心的组件:
- Channels
- Buffers
- Selectors
Java NIO还有很多其他类和组件,但在我看来,Channel
、Buffer
和Selector
组成了整个API的核心。剩下的组件,比如Pipe
和FileLock
都仅仅是用来和这三个组件结合使用的工具类。因此,本概述会把焦点放在这三个组件上。
Channels和Buffers
典型的,NIO中所有的io操作都从一个Channel
开始。一个Channel
有点像一个流。数据可以从一个Channel
读入一个Buffer
。数据也可以从一个Buffer
写入一个Channel
。如下图:
Java NIO中有很多不同类型的Channel
和Buffer
。以下是其中主要的Channel
实现:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
如你所见,以上实现包括了UDP + TCP网络IO,以及文件IO。
还有一些接口伴随着这些类,但为了简单起见,本文就不再详述了。
以下是Java NIO中Buffer
的核心实现类:
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
这些Buffer
包括你可以通过IO传输的基本类型:byte、double、float、int、long、short和字符。
Java NIO中还有一个和内存映射文件一起使用的MappedByteBuffer
,但我不会在本概述中讨论它。
Selectors
一个Selector
允许每个线程负责多个Channel
。如果你的应用有很多连接(Channels),但每个连接的流量很小,这就很有用。比如:聊天服务器。
下图展示了一个线程通过一个Selector
处理三个Channel
:
向一个Selector
中注册多个Channel
,然后调用其select()
方法,该方法会阻塞直至其中一个Channel
有事件发生。一旦该方法返回,这个线程就可以处理这些事件。比如:新建连接事件,数据到达事件等。
说明
发现貌似有人在看这个系列文章了,有必要说明下,这个Java NIO系列来源于jenkov.com,本文只是翻译,希望大家千万不要误会,本文不是原创。原文地址:Java NIO。