读书人

【Java NIO】NIO引见

发布时间: 2012-12-19 14:13:14 作者: rapoo

【Java NIO】NIO介绍
概述

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

?

原理【Java NIO】NIO引见

?

?? ? ??系统运行的性能瓶颈通常在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.线程间通信

读书人网 >编程

热点推荐