初步了解什么是java nio

本文深入讲解Java NIO的三大核心组件:channel通道、buffer缓存区、selector选择区。介绍了NIO模型如何通过缓存区实现非阻塞性I/O,提高数据处理效率。并详细解释了通道的双向特性、缓冲区的使用方法及选择区如何监听和控制多个通道。
摘要由CSDN通过智能技术生成

参考文献

深入理解Java NIO
Java NIO?看这一篇就够了!

一、概念

在java1.4中引入了nio类,完整名字为new input output ,是一种非阻塞的io模型。
他的
nio主要由三大块构成,channel通道、buffer缓存区、selector选择区。数据从通道进入缓存区,在缓存区写入;读取则是先读取到缓存区中,然后再通过通道输出。选择区的作用则是监听多个数据通道。
传统的io因为没有缓存区的存在,所以需要每次都完整的读取写入完后在继续下去,所以为阻塞模型,缓存区的存在让模型变为了非阻塞的模型。
选择区的作用是可以在一个在线程中控制多个通道,就像国家电网中的变压器,可以只用一个控制器就对来自不同发电站的电做不同的处理

二、channel通道

通道与流不同的地方在于通道为双向的,而流为单向的。
与通道相连的只能是缓存区,通道的存在使得io可以异步进行无需等待

三、buffer区

buffer的基本使用方法:

  1. 新建一个buffer,如ByteBuffer.allocate(大小)返回一个Bytebuffer类型的对象
  2. 写入数据到buffer
  3. 调用flip()方法切换模式(从读取模式切换为写入模式或者反过来)
  4. 从buffer中读取数据
  5. 使用clear()或compact()方法,清空区域

实例:来自于Java NIO系列教程(三) Buffer

RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");
//获取一个通道
FileChannel inChannel = aFile.getChannel();
//创建一个缓存区
ByteBuffer buf = ByteBuffer.allocate(48);
//写入缓存区
int bytesRead = inChannel.read(buf);
while (bytesRead != -1) {//缓存区中存在数据时
  buf.flip();  //切换成读取模式
  while(buf.hasRemaining()){
      System.out.print((char) buf.get()); //一次读取一个byte
  }

  buf.clear(); //清空
  bytesRead = inChannel.read(buf);//继续将通道中的数据写入
}
aFile.close();

四、selector选择区

selector需要和通道配合使用
步骤:来源于Java NIO系列教程(六) Selector

  1. 创建selector,Selector selector = Selector.open();
  2. 将通道注册到selector上,注意通道必须处于非阻塞状态,选择区仅支持非阻塞的管道。SelectionKey key = channel.register(selector, Selectionkey.OP_READ);第二个参数为监听的事件类型。
  3. 返回的key类型的对象可以获取很多东西,如通道、selector等信息。
    注册完成后就可以使用selector里面的方法了,如调用select()方法,这个方法会等待到有就绪的注册的事件出现
    方法还有selectedkey()方法等。详情看上面的链接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值