一、缓冲区 java.nio.buffer
创建缓冲区:
public static ByteBuffer allocate(int capacity);
public static ByteBuffer wrap(byte[] array);
public static ByteBuffer wrap(byte[] array, int offset, int length);
访问方法
get():
前三个get方法是相对读取。就是相对于位置状态来读取数据,并且会改变position位置状态。
byte get();
ByteBuffer get(byte dst[]);//读取bytebuffer中数据写入 dst[]
ByteBuffer get(byte dst[],int offset, int length);
该读取数据是绝对读取(一个byte),即会忽略limit和position值。并完全绕过了缓冲区的状态统计方法。
就是说不会改变buffer内部的位置状态。
byte get(int index);
put();
与get类似 前四个put方法是相对读取。即受position 以及limit影响,并且会改变 position。
ByteBuffer put( byte b );
ByteBuffer put( byte src[] ); //从src[]写入bytebuffer
ByteBuffer put( byte src[], int offset, int length );
ByteBuffer put( ByteBuffer src );
最后一个是绝对写入 不会影响position等位置状态。
ByteBuffer put( int index, byte b );
除了byte的读写还有其他类型的读写方法。并且他们都存在相对以及绝对两类。
其他方法:
filp():作了两件事情:1.将limit指向现在position的位置 2.将position设置为0
rewind():将position设置为0,但不改变limit位置
clear():position设置为0,limit设置为capacity
compact():将position和limit之间的数据复制到缓冲区开始,为后续的put()/read()让出空间
二、通道(SocketChannel、FileChannel等)
以SocketChannel为例:
方法摘要 | |
---|---|
abstract boolean | connect(SocketAddress remote) 连接此通道的套接字。 |
abstract boolean | finishConnect() 完成套接字通道的连接过程。 |
abstract boolean | isConnected() 判断是否已连接此通道的网络套接字。 |
abstract boolean | isConnectionPending() 判断此通道上是否正在进行连接操作。 |
static SocketChannel | open() 打开套接字通道。 |
static SocketChannel | open(SocketAddress remote) 打开套接字通道并将其连接到远程地址。 |
abstract int | read(ByteBuffer dst) 将字节序列从此通道中读入给定的缓冲区。 |
long | read(ByteBuffer[] dsts) 将字节序列从此通道读入给定的缓冲区。 |
abstract long | read(ByteBuffer[] dsts, int offset, int length) 将字节序列从此通道读入给定缓冲区的子序列中。 |
abstract Socket | socket() 检索与此通道关联的套接字。 |
int | validOps() 返回一个操作集,标识此通道所支持的操作。 |
abstract int | write(ByteBuffer src) 将字节序列从给定的缓冲区中写入此通道。 |
long | write(ByteBuffer[] srcs) 将字节序列从给定的缓冲区写入此通道。 |
abstract long | write(ByteBuffer[] srcs, int offset, int length) 将字节序列从给定缓冲区的子序列写入此通道。 |
ServerSocketChannel不提供bind()方法,需要通过底层的socket的bind()方法:SocketChannel.socket().bind();
public ServerSocket socket();
设置阻塞状态:
public SelectableChannel configureBlocking(boolean block);
public boolean isBlocking();
非阻塞的socketChannel需要通过isConnected()或者finishConnect()判断时候连接成功
三、选择器selector
打开/关闭
public static Selector open();
public boolean isOpen();
public abstract void close();
选择器注册标记类型:
OP_READ
OP_WRITE
OP_CONNECT
OP_ACCEPT
获取/设置标志位(SelectionKey类方法):
public int interestOps();
public SelectionKey interestOps(int ops);
通道和选择器配合工作(SelectableChannel类方法):
public SelectionKey register(Selector sel, int ops);//注册
public SelectionKey register(Selector sel, int ops, object att);//带附件注册
public SelectionKey keyfor(Selector sel);//查找该选择器对应的selectionkey
public boolean isRegistered();//判断通道是否已注册
根据selectionKey获取关联的选择器实例和Channel实例(Selectionkey类方法)
Selector selector();
SelectionChannel channel();
void cancel();//注销该selectionkey键
等待时间发生(Selector类方法):
public int select();//阻塞等待
public int select(long timeout);
public int selectNow();//非阻塞版本
有事件发生,获取选择器上的selectionkeys(Selector类方法):
public Set<selectionkey> keys();//selector上注册的所有键
public Set<SelectionKey> selectedkeys();//已选键集,即发生事件的键
判断通道是否可进行IO操作(selectionkey类方法):
public int readyops();
public boolean isReadable();
public boolean isWritable();
public boolean isConnectable();
public boolean isAcceptable();
selectionkey中与附件相关(selectionkey类方法)::
public object attach(object ob);
public object attachment();