【Java NIO】NIO介绍

概述

新IO使用内存映射文件的方式来处理输入/输出,新IO将文件或文件的一段区域映射到内存中,这样可以像访问内存一样来访问文件(OS里虚拟内存的概念)。

 

原理

 

       系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内容,如果没有内容进来,read()也是傻傻的等,这会影响我们程序继续做其他事情,那么改进做法就是开设线程,让线程去等待,但是这样做也是相当耗费资源的。

      Java NIO非堵塞技术实际是采取Reactor模式,或者说是Observer模式为我们监察I/O端口,如果有内容进来,会自动通知我们,这样,我们就不必开启多个线程死等,从外界看,实现了流畅的I/O读写,不堵塞了。

  

      ##联想到 获取数据的方式 “pull和push” 

 

NIO有一个主要的类Selector,这个类是一个观察者,只要我们把需要探知的socketchannel 告诉Selector(向Selector注册Channel),我们接着做别的事情,当有事件发生时,Selector会通知我们,传回一组SelectionKey,我们读取这些Key,就会获得我们刚刚注册过的socketchannel,然后,我们从这个Channel中读取数据,放心,包准能够读到,接着我们可以处理这些数据。


Selector内部原理 实际是在做一个对所注册的channel的轮询访问,不断的轮询(目前就这一个算法),一旦轮询到一个channel有所注册的事情发生,比如数据来了,他就会站起来报告,交出一把钥匙,让我们通过这把钥匙来读取这个channel的内容。

 

 

------读java nio-----

两种处理任务的方式(管理IO通道的模式):

1.一个io通道一个线程,在io通道没有就绪时,线程阻塞。

不易扩展

2.多个io通道一个线程,线程选择就绪通道。在io通道没有就绪时,线程做其他事情。

方式2描述了快速检查大量资源中的任意一个是否需要关注,在某些还没有就绪时不必等待

 

可选择通道 (注册) 选择器(select())选择键(对应通道)

p126

 

 

 

两大核心类:ChannelBuffer

 

Channel

类似传统流对象,但有区别,主要有两个区别:

1.

2.

Channel是个接口,位于java.nio.channels包下,其继承结构如下图

//

通过节点流的getChannel()方法来获取相应的Channel实例,不同节点流获得的 Channel是不一样的, 如FileInputStream和FileOutputStream的 getChannel()返回FileChannel。//

 

Channel三个主要方法:map()、read()、write().//

 

Buffer

 

 

示例

 

相关概念及主题

1.os中虚拟内存

2.push和pull

3.Reactor模式

4.线程间通信

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值