Java NIO由下面几个核心组件组成:
- Channel
- Buffer
- Selector
Java NIO有更多的类和组件,但是依我看来,Channel,Buffer 和 Selector是核心的API。剩余的组件,例如Pipe 和 FileLock,仅仅是与三个核心组件一起使用的实用工具类。所以在此处,我会把重点放在这三个组件上。其他的组件会在它们自己的章节来学习。具体请参考教程的目录。
Channel 和 Buffer
通常NIO的所有IO都是从Channel开始的。Channel有点儿像stream。从Channel,数据可以被读取到Buffer。当然也可以从Buffer写入到Channel。下面是一个相关示意图:
![](https://img.haomeiwen.com/i8430497/ce459918733b3358.png)
有几种Channel 和 Buffer的一些类型。下面是Java NIO中主要的一些Channel实现:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
如你所见,这些channel包括了UDP + TCP网络IO,文件IO等。同时还有一些其他的有趣接口,但是为了此篇教程的简单明了,我不准备在这里列出,在与其相关的地方,自然会给出解释说明。
下面的清单是Java NIO中Buffer的一些核心实现:
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
这些Buffer包括了你可以通过IO发送的基础数据类型:byte,short,int,long,float,double 和 character。
Java NIO也有一个MappedByteBuffer,它与内存映射文件同时使用。这里我暂时先不会详细介绍它
Selector
Selector可以让单个线程来处理多个channel。如果你的应用打开许多连接(Channel),但是每个连接的流量都很低(例如在一个聊天服务中),那么这个是非常便利的。
下面的图例是一个线程,使用1个Selector同时处理3个Channel的场景:
![](https://img.haomeiwen.com/i8430497/ca64b4c8c961f9bf.png)
要使用Selector,你需要像Selector注册channel。然后调用select()方法。此方法将会阻塞,直到有已注册的channel中事件准备就绪。一旦方法返回,线程就可以处理这些事件了。这些事件包括传入连接,接收到了数据等等。
想要查看此教程的目录请点击:Java NIO教程目录贴地址
网友评论