Java专题十一(2):NIO
2021-02-07 14:15
标签:exception tor 字节流 except 硬件 不可 pos 一个 令行 Non-blocking IO(非阻塞IO) NIO可以让你非阻塞的使用IO,当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情。当数据被写入到缓冲区时,线程可以继续处理它。从缓冲区写入通道也类似。 通道代表面向实体的开放式连接,执行读写等IO操作,其中实体包括硬件设备,文件,网络套接字等 通道 类图关系如下: 相当于内存块,可读可写 类图关系如下: 一个 Java专题十一(2):NIO 标签:exception tor 字节流 except 硬件 不可 pos 一个 令行 原文地址:https://www.cnblogs.com/myibu/p/12775637.htmlJava专题十一(2):NIO
0. NIO是什么
1. 通道Channel
Channel
与缓冲区Buffer
密不可分,不同于IO从字符或字节流中读写操作,Channel
既可以从Buffer
中读取数据,也可以写入数据到Buffer
中
Selector
结合实现多路IO复用
int read(ByteBuffer dst)
int write(ByteBuffer src)
Channel
中一些重要方法:
方法
说明
open()
用于创建Channel对象,如
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
SelectionKey register(Selector sel, int ops)
只适用于
SelectableChannel
类型的通道,用于向Selector中注册操作,当通道中有注册过的操作时,可以对通道进行操作。ops包括4种: SelectionKey.OP_ACCEPT
/SelectionKey.OP_CONNECT
/SelectionKey.OP_READ
/SelectionKey.OP_WRITE
SelectableChannel configureBlocking(boolean block)
只适用于
SelectableChannel
类型的通道,用于配置是否阻塞模式,如serverSocketChannel.configureBlocking(false);
int read(ByteBuffer dst)
将Channel里的数据读取到Buffer中
int write(ByteBuffer src)
将Buffer中的数据写入到Channel中
2. 缓冲区Buffer
ByteBuffer
中一些重要方法:
方法
说明
allocate(int capacity)
用于创建容量为capacity的Buffer对象,如
ByteBuffer buffer = ByteBuffer.allocate(1024);
boolean hasRemaining()
是否有元素在
position
和limit
之间
ByteBuffer put(byte b)
将一个字节写入Buffer中
ByteBuffer put(byte[] src)
将字节数组写入Buffer中
byte get()
从Buffer中获取一个字节
byte get(byte[] dst)
将Buffer中数据写入字节数组中
ByteBuffer flip()
从写模式切换为读模式,
limit = positon; positon = 0; mark = -1
ByteBuffer rewind()
position = 0; mark = -1;
ByteBuffer clear()
position = 0; limit = capacity; mark = -1;
ByteBuffer reset()
position = mark;
capacity
、position
、limit
说明:
flip()
切换为读模式时,position设为0flip()
切换为读模式时,limit设为position3. 选择器Selector
Selector
可以处理多个Channel
,通常与SelectableChannel
类型的Channel
结合使用Selector
中一些重要方法:
方法
说明
Selector open()
用于创建一个Selector对象,如
Selector selector = Selector.open();
int select()
选择ready状态的操作集(keys set)
Set
获取选择器已经选择的操作集(keys set)
4.一个完整示例
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;
public class Server {
public static void main(String[] args) throws Exception{
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(new InetSocketAddress("127.0.0.1", 8017));
Selector selector = Selector.open();
serverSocketChannel.configureBlocking(false);
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
while(true){
selector.select();
Set
telnet 127.0.0.1 8017
,换行,输入abkey.isAcceptable()
key.isReadable()
a
key.isWritable()
i am server!!!
key.isReadable()
b
key.isWritable()
i am server!!!
上一篇:C#得到10000以内素数
下一篇:C++11:06for关键字