NIO的学习(一)
注:本文章主要借鉴的是葛一鸣的《java程序性能优化》一书以及网上优秀博客,所有的文字都是自己纯手打,一是为了加强自己的印象,二是提高自己写文章的能力。
- 什么是NIO?
学习一个东西,首先要了解它的概念,只有概念清晰了,准确了,你才能真正掌握它。NIO是NEW I/O的简称,与旧式的基于流的I/O相对,是java 1.4中引入JDK的一套新的java I/O标准。它有如下的特性:
- 标准的IO流基于字节流和字符流进行操作,而NIO为所有原始类型提供Buffer支持(见下图一),它是基于块(缓存就是一块连续的内存块)的,以块为单位处理数据。它最重要的2个组件就是缓冲Buffer和通道Channel,Buffer是NIO读写数据的中转地,通道是缓冲数据的源头或者目的地,是缓冲的接口,可以向缓冲读取或者写入数据,他们的关系如图二。

图一

图二
- 可以异步IO,当通道在向缓冲读取或者写入数据时,线程不会阻塞,可以干其他事情
- NIO中Channel的主要实现有:FileChannel,DataChannel,SocketChannel,ServerSocketChannel,这些通道涵盖了UDP 和 TCP 网络IO,以及文件IO。
- NIO还有一个选择器的概念,用来监听多个通道的事件,例如连接打开,数据到达。Selector允许单个线程处理多个通道。
2.NIO和IO有什么不同呢?
- NIO和IO最大的第一个区别就是IO是面向流的,NIO是面向缓冲区的,我们用普通的inputstream是一个字节一个字节的读,他没有缓存的地方,所以你不能前后移动流中的数据,如果要进行这类操作就要把流放到缓冲区。NIO是把数据读入到一个它稍后处理的缓冲区,可以前后移动。
- 另一个区别是IO是阻塞的,NIO是 非阻塞的。单一个线程调用read()和write()方法时,在它完全读入或者写入之前,这个线程是阻塞的,不能干其他事。NIO是非阻塞的,一个线程通过通道读取或者写入数据时,如果读的时候,没有数据可用,这个线程不会阻塞在这里,等待线程读取完毕。同理写的时候,不用等待它完全写入,这个线程可以做其他的事了。通常线程空出来的时间用来执行其他通道的IO操作,所以一个线程可以管理多个通道。
- NIO选择器允许一个线程管理多个通道。即你可以把多个通道注册到选择器里面,然后在用一个线程区管理选择器。

浙公网安备 33010602011771号