这次学习Java NIO,我是在将传统的IO和NIO进行比较学习的,这样我对于一个不熟悉的东西,对它的认识会更快点。
也是出于工作需要快速学习并应用。了解的比较浅。
java.nio(java non-blocking IO),是jdk1.4 里提供的新api ,为所有的原始类型提供缓存支持。
标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。
JavaNIO中最重要的通道的实现:
FileChannel:从文件中读写数据。
DatagramChannel:能通过UDP读写网络中的数据。
SocketChannel:能通过TCP读写网络中的数据。
ServerSocketChannel:可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel
NIO主要用来解决BIO大并发操。
NIO之FileChannel:单独的读写文件操作、拷贝操作,可以用它,但是在文件比较小的情况下,FileChannel效果不佳。
在打开一个I/O通道后,read()将一直等待在端口一边读取字节内容,如果没有内容进来,read()也是傻傻的等,这会影响我们程序继续做其他事情。
实际是采取Reactor模式(反应器)或者说是Observer模式(观察者)为我们监察I/O端口,如果有内容进来,会自动通知我们,这样,我们就不必开启多个线程死等,从外界看,实现了流畅的I/O读写,不堵塞了。
Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器。
面向流的I/O系统一次一个字节的处理数据,一个输入流产生一个字节的数据,一个输出流产生一个字节的数据。
一个面向块的I/O系统以块的形式处理数据。每一个操作都在一步中产生或者消费一个数据块。
IO:面向流(字节)、阻塞IO、无选择器。
NIO:面向缓存(块)、非阻塞IO、选择器(可分发的)。
阻塞IO:一个线程被写操作或者读操作调用时,他就阻塞了,直到他当前的事情全部干完,这才可以被其他的操作使用。
非阻塞NIO:使一个线程从某通道发送请求读取/写数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。
NIO的大致流程为:
输入文件->缓冲区->通道->缓冲区->程序处理数据->缓冲区->通道->缓冲区->输出文件。
I/O的大致流程为:
输入文件->流->程序处理数据->流->输出文件。
(NIO与 I/O 比较,通道就像是流,区别是流是单向的,要不是输出流、要不是输入流。NIO可用于读、写还可以同时用于读写)
(1).FileChannel 从文件中读写数据。
(2).DatagramChannel 能通过UDP读写网络中的数据。
(3).SocketChannel 能通过TCP读写网络中的数据。
(4).ServerSocketChannel可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel。
http://ifeve.com/channels/
http://www.cnblogs.com/BaiYiShaoNian/p/4916138.html ------FileChannel应用
http://blog.csdn.net/guoxilen/article/details/25510631 -----Java - NIO之Channel(FileChannel)
336k |
80449k=78G |
476029k=464G |
NIo时间是:45 |
NIo时间是:738 |
NIo时间是:9901 |
Io时间是:2 |
Io时间是:502 |
Io时间是:16825 |