1. 程式人生 > >java nio學習:緩衝區、通道和選擇器

java nio學習:緩衝區、通道和選擇器

java nio中引入了緩衝區,緩衝區中的資料可以寫入通道,也可以從通道中讀取資料到緩衝區。nio中的緩衝區就是對陣列的簡單封裝,緩衝區有讀模式和寫模式,緩衝區的屬性有容量(capacity)、限制(limit)、位置(position),容量表示陣列的大小,限制表示第一個不能讀寫的位置,位置表示讀寫索引的位置。

新申請一個1024位元組的緩衝區

ByteBuffer buf = ByteBuffer.allocate(1024);
System.out.println(buf);//pos=0 lim=1024 cap=1024
向緩衝區中放入兩位元組資料
ByteBuffer buf = ByteBuffer.allocate(1024);
buf.put((byte)1);
buf.put((byte)2);
System.out.println(buf);//pos=2 lim=1024 cap=1024
翻轉緩衝區,緩衝區從讀模式變為寫模式,pos為緩衝區的讀位置,lim為讀資料的上界
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()方法可建立新的連線

ServerSocketChannel acceptor = ServerSocketChannel.open();
acceptor.socket().bind(new InetSocketAddress(80));<pre name="code" class="java">
SocketChannel channel = acceptor.accept();

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();