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


 








  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值