Java NIO 教程
Channels and Buffers
在基本的IO API中,通常处理的是字节流和字符流。
在NIO中,处理的是Channels和buffers,数据通常是从channel中读取到buffer中,或者是将buffer写入到channel中去
Non-blocking IO
Java NIO允许你做非阻塞的IO操作。举个例子来说,一个线程可以向channel申请读取数据到buffer中,当channel读取数据到buffer中的时候,线程仍然可以做别的事情。一旦数据读取到了buffer中,线程马上继续处理,对于将数据写入到channel中也是相同的道理
Selectors
Java NIO包含一个"selectors"的概念,一个selector是一个对象,selector可以监控多个channels事件(比如连接的打开,数据的到达)。因此一个线程就可以监听多个channels
Java NIO 概述
Java NIO包含的几个主要的组件:
1. Channels
2. Buffers
3. Selectors
Java NIO不光有上述3个组件,但是Channel, Buffer和Selector是Java NIO的核心。其他的一些工具类,都是基于上述三者的组合。
Channels和Buffers
通常,所有在NIO的IO都从一个Channel开始,一个Channel是一个bit类似于一个Stream。从Channel数据可以读到一个buffer中去,数据当然也可以通过Buffer的形式写入到Channel中去。
Channels read data into Buffers, and Buffers write data into Channels
下面有一些Channel和Buffer的类型。如下列出了主要的Channel接口
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
正如你所看到的,channels涉及到了UDP,TCP,IO还有文件IO
还有一些接口伴随上述的类
下面是一些关于Buffer的实现:
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
这些Buffer涉及到了基本的Java数据类型:byte, short, int, long, float, double和characters
Selectors
Selector允许一个线程去处理多个Channel。这有易于你的程序有很多的连接(Channels)
为了使用Selector你应该将要使用的Channel注册到Selector上面。然后调用Select()方法。这个方法将阻塞直到有一个事件能处理注册的channel。一旦这个select()函数值做了返回,线程就可以处理这些事件