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