NIO总结(一)

NIO的背景:IO流->输入输出流->BIO->BlockingIO(阻塞式IO):高并发场景下无法解决的问题

NIO引出:new IO/NonBlockingIO(非阻塞式IO),一种新的IO机制,在JDK1.4提出的一套新的IO机制,BIO有阻塞现象。

服务器对多个客户端提供服务,开多个线程同时处理多个访问;线程是非常宝贵的资源,每开一个线程都耗费资源和CUP(一个普通电脑也就开100以内线程)。

客户端访问多,当线程开多时候解决方法:
很多时候开个QQ不聊天,这也是开个线程在占用QQ服务器,开个QQ时候也占用线程占用资源。

当线程太多计算机性能跟不上时候,现在处理机制:    
NIO主要解决问题:一个线程同时为多个客户端服务☆☆☆,增加selector(选择器),每个客户端相当于一个线程。

selector作用:        
1.允许客户端(线程)在选择器上注册表示自己要处理什么类型的事件    
2.监测线程注册事件是否就绪,如果事件就绪,就交给线程处理    
这样线程数量大量减少,减少线程数量,提高线程利用率(IOS处理机制)
ACCEPT CONNECT READ WRITE以上情况如果用BIO时候,出现阻塞情况,accept()监听本机指定端口等待客户端连接,accept(),connect(),read(),write()BIO的四个方法都可能产生阻塞
如法处理单一线程面对多个客户端
情况实现不了,一个线程阻塞住,导致其它排号的线程也是等待状态。
NIO再实现以上(ACCEPT CONNECT READ WRITE)情况不会产生阻塞
服务器市场因为NIO出现后Java垄断半壁江山
BIO出现时间:1.0版本,最开时候
BIO:面向流操作字节字符,具有方向性(传统BIO相当于水管子)
InputStream(字节输入流) OutputStream(字节输出流) Read(字符输入流) Write(字符输出流)

学NIO为学大数据做准备,大数据底层技术有NIO:通道(Channel),缓冲区(Buffer),选择器(Selector)            
NIO:面向通道操作缓冲区,可以双向传输数据(好比地下通道,既可以读也可以写)            
①Channel(通道) ②Buffer(缓冲区) ③Selector(选择器)            
Buffer函数:java.nio---是一个抽象类abstrate,得使用Buffer它的子类新建对象            
缓冲区,就是内存中开辟的一段连续空间,用来临时存放数据。Buffer是抽象类,不能直接用,一般用它的子孙类。            
Buffer子类:ByteBuffer,CharBuffer,DoubleBuffer,FloatBuffer,IntBuffer,LongBuffer            
ShortBuffer,跟数据类型有点对应少一个boolean。这七个实现类功能类似,只是类型不一样。            
ByteBuffer最常用,字节缓冲区。最常用的原因:所有的数据最后都可以用字节表示。            
缓冲区有三个非常重要的值:            
1.capacity 缓冲区容量,值不可变,缓冲区大小一旦创建容量固定。            
2.limit 缓冲区限制位,值可变但是不能大于capacity            
3.position 缓冲区当前位,永远不能大于limit,写入一个a,position自动向后移动一位            
当写完abcdefg,position在g下一位用position()指定位置,把limit设定上值到g的位置多次创建缓冲区太耗费内容,缓冲区最好重复利用            
byte b = buffer.get();            
System.out.println(b);            
a输出97,b输出98,c输出99是ASCII:美国信息交换标准码(数据存储上统一的编码规则)            
计算机存储时用二进制表示a的二进制是01100001,十进制是97,所以abc对应97,98,99是十进制的表示方法;创建一个缓冲区,缓冲区Buffer不提供构造方法,allocate和wrap两种创建方法allocate()初始化一个缓冲期大小allocate(1024)。wrap("abcdef".getByte())可以直接写入数据写入缓冲区用.put()方法,读缓冲区.get()方法buffer.flip();//反转,重绕(重新定位postion和limit)缓冲区,切换为读就绪状态;buffer.clear():清除缓冲区;buffer.rewind():重绕缓冲区,设置postion=0不会真的帮你清空,但是可以继续用已定义的缓冲区,只是把position和limit重新定位,没有影响以前数据没删,是做覆盖掉以前添加的abc,clear这种机制比真正删除效率还要高以前缓冲区数据是abc,调clear方法后,写入xy后,a,b被覆盖,当到c时已经到limit位置所以覆盖两个还是没问题,因为c不到已经到limit。磁盘垃圾箱原理,垃圾箱只是把文件标记为无效,为了不让别人看到数据必须格式化。
hasRemaining(),判断当前位置是否在限制(limit)范围内(判断缓冲区是否被被填满)


4.mark 缓冲区的标记位,mark标记完,调reset()方法,后postion回到mark位置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戰士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值