概述
新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
两大核心类:Channel 、Buffer 。
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.线程间通信