java nio學習:緩衝區、通道和選擇器
阿新 • • 發佈:2019-02-16
java nio中引入了緩衝區,緩衝區中的資料可以寫入通道,也可以從通道中讀取資料到緩衝區。nio中的緩衝區就是對陣列的簡單封裝,緩衝區有讀模式和寫模式,緩衝區的屬性有容量(capacity)、限制(limit)、位置(position),容量表示陣列的大小,限制表示第一個不能讀寫的位置,位置表示讀寫索引的位置。
新申請一個1024位元組的緩衝區
ByteBuffer buf = ByteBuffer.allocate(1024);
System.out.println(buf);//pos=0 lim=1024 cap=1024
向緩衝區中放入兩位元組資料
翻轉緩衝區,緩衝區從讀模式變為寫模式,pos為緩衝區的讀位置,lim為讀資料的上界ByteBuffer buf = ByteBuffer.allocate(1024); buf.put((byte)1); buf.put((byte)2); System.out.println(buf);//pos=2 lim=1024 cap=1024
ByteBuffer buf = ByteBuffer.allocate(1024);
buf.put((byte)1);
buf.put((byte)2);
buf.flip();
System.out.println(buf);//pos=0 lim=2 cap=1024
呼叫get()可獲得緩衝區中的資料,hasRemaining()可檢查資料是否讀取完while(buf.hasRemaining()) System.out.println(buf.get()); System.out.println(buf);//pos=2 lim=2 cap=1024
clear()可清空緩衝區,使其為讀通道資料做好準備
buf.clear();
System.out.println(buf);//pos=0 lim=1024 cap=1024</span>
java nio抽象出通道的概念,可以向通道中寫入資料或從通道中讀取資料
ServerSocketChannel用於監聽和接收連線,可通過呼叫ServerSocketChannel的open()方法建立,接著繫結本地地址就可監聽連線,accept()方法可建立新的連線
SocketChannel channel = acceptor.accept();ServerSocketChannel acceptor = ServerSocketChannel.open(); acceptor.socket().bind(new InetSocketAddress(80));<pre name="code" class="java">
SocketChannel表示網路連線,用於讀寫資料。
ByteBuffer buf = ByteBuffer.allocate(1024);
while( (channel.read(buf)) > 0 )
{
buf.flip();
channel.write(buf);
buf.clear();
}
channel.close();
java nio通過選擇器,可以同時監視多個通道上是否有事件發生。一個通道可以在選擇器上註冊接受、可讀、可寫和連線事件,當事件發生時,選擇器select呼叫就會返回,可以通過檢查返回的選擇鍵獲取事件資訊
選擇器可通過open()方法建立,接著就可以在上面註冊關心的事件
Selector selector = Selector.open();
acceptor.register(selector, SelectionKey.OP_ACCEPT);//註冊接受事件
channel.register(selector, SelectionKey.OP_READ);//註冊讀事件
呼叫select()方法就可以等待事件的發生,接著處理髮生的事件
selector.select();
Set<SelectionKey> keys = selector.selectedKeys();
for (SelectionKey key : keys)
{
if(key.isAcceptable())
{
...
}
else if(key.isReadable())
{
...
}
...
}
keys.clear();