代码改变世界

Java NIO 开篇

2014-05-20 13:04  Loull  阅读(332)  评论(0编辑  收藏  举报

 一些很好的blog(待更新):

1、NIO入门

2、NIO.2 入门,第 1 部分: 异步通道 API

 

  • I- 就是从硬盘到内存
  • O- 就是从内存到硬盘

一、阻塞IO

第一种方式:我从硬盘读取数据,然后程序一直等,数据读完后,继续操作。这种方式是最简单的,叫阻塞IO

第二种方式:我从硬盘读取数据,然后程序继续向下执行,等数据读取完后,通知当前程序(对硬件来说叫中断,对程序来说叫回调),然后此程序可以立即处理数据,也可以执行完当前操作在读取数据。

在 Java IO 中,这两种都是阻塞式 IO,NIO 引入了非阻塞式 IO。

阻塞:就是看是否阻塞当前线程。

 

二、同步和异步

同步:轮询查看

异步:通知

还有一种就是同步 IO 和异步 IO。经常说的一个术语就是“异步非阻塞”,好象异步和非阻塞是同一回事,这大概是一个误区吧。

 

三、流 Stream

在旧的 Java IO 系统中,是基于 Stream 的,即“流”,流式 IO。

当程序从硬盘往内存读取数据的时候,操作系统使用了 2 个“小伎俩”来提高性能,那就是预读,如果我读取了第一扇区的第三磁道的内容,那么你很有可能也会使用第二磁道和第四磁道的内容,所以操作系统会把附近磁道的内容提前读取出来,放在内存中,即缓存

(PS:以上过程简化了)

通过上面可以看到,操作系统是按块 Block从硬盘拿数据,就如同一个大脸盆,一下子就放入了一盆水。但是,当 Java 使用的时候,旧的 IO 确实基于 流 Stream的,也就是虽然操作系统给我了一脸盆水,但是我得用吸管慢慢喝。

于是,NIO 横空出世。

 

四、java nio

Java NIO: Channels and Buffers(通道和缓冲区)

标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中

可以想象一个煤矿,通道时一个包含煤层(数据)的矿藏,而缓冲区则是派送到矿藏的卡车。卡车载满煤炭而归,而我们再从卡车上获得煤炭。也就就说,我们并没有与通道直接交互,我们只是和缓冲区交互,并把缓冲区派送到通道。通道要么从缓冲区获得数据,要么像缓冲区发送数据。

Java NIO: Asynchronous IO(异步IO)

Java NIO可以让你异步的使用IO,例如:当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情。当数据被写入到缓冲区时,线程可以继续处理它。从缓冲区写入通道也类似。

Java NIO: Selectors(选择器)

Java NIO引入了选择器的概念,选择器用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个的线程可以监听多个数据通道。

 

 

 

 

Reference

http://segmentfault.com/q/1010000000314712

http://baike.baidu.com/view/1007979.htm java.nio.channels

JAVA 中BIO,NIO,AIO的理解