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关键字