Java NIO

一、缓冲区 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  booleanconnect(SocketAddress remote)
          连接此通道的套接字。
abstract  booleanfinishConnect()
          完成套接字通道的连接过程。
abstract  booleanisConnected()
          判断是否已连接此通道的网络套接字。
abstract  booleanisConnectionPending()
          判断此通道上是否正在进行连接操作。
static SocketChannelopen()
          打开套接字通道。
static SocketChannelopen(SocketAddress remote)
          打开套接字通道并将其连接到远程地址。
abstract  intread(ByteBuffer dst)
          将字节序列从此通道中读入给定的缓冲区。
 longread(ByteBuffer[] dsts)
          将字节序列从此通道读入给定的缓冲区。
abstract  longread(ByteBuffer[] dsts, int offset, int length)
          将字节序列从此通道读入给定缓冲区的子序列中。
abstract  Socketsocket()
          检索与此通道关联的套接字。
 intvalidOps()
          返回一个操作集,标识此通道所支持的操作。
abstract  intwrite(ByteBuffer src)
          将字节序列从给定的缓冲区中写入此通道。
 longwrite(ByteBuffer[] srcs)
          将字节序列从给定的缓冲区写入此通道。
abstract  longwrite(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();

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值