java NIO 学习总结(NIO和IO比较)

    这次学习Java NIO,我是在将传统的IO和NIO进行比较学习的,这样我对于一个不熟悉的东西,对它的认识会更快点。
也是出于工作需要快速学习并应用。了解的比较浅。

1.java NIO说明:

java.nio(java non-blocking IO),是jdk1.4 里提供的新api ,为所有的原始类型提供缓存支持。

2.Channels and Buffers(通道和缓冲区):

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

JavaNIO中最重要的通道的实现:

    FileChannel:从文件中读写数据。

    DatagramChannel:能通过UDP读写网络中的数据。

   SocketChannel:能通过TCP读写网络中的数据。

   ServerSocketChannel:可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel

3. NIO主要用来干什么?

NIO主要用来解决BIO大并发操。
NIO之FileChannel:单独的读写文件操作、拷贝操作,可以用它,但是在文件比较小的情况下,FileChannel效果不佳。

4.  普通的IO:

在打开一个I/O通道后,read()将一直等待在端口一边读取字节内容,如果没有内容进来,read()也是傻傻的等,这会影响我们程序继续做其他事情。

5.   Java NIO非堵塞技术:

        实际是采取Reactor模式(反应器)或者说是Observer模式(观察者)为我们监察I/O端口,如果有内容进来,会自动通知我们,这样,我们就不必开启多个线程死等,从外界看,实现了流畅的I/O读写,不堵塞了。

      Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器。

 

6.I/O以流的方式处理数据,而NIO以块的方式处理数据。

面向流的I/O系统一次一个字节的处理数据,一个输入流产生一个字节的数据,一个输出流产生一个字节的数据。

一个面向块的I/O系统以块的形式处理数据。每一个操作都在一步中产生或者消费一个数据块。

 

7.普通的IONIO比较:

IO:面向流(字节)、阻塞IO、无选择器。

NIO:面向缓存(块)、非阻塞IO、选择器(可分发的)。

阻塞IO:一个线程被写操作或者读操作调用时,他就阻塞了,直到他当前的事情全部干完,这才可以被其他的操作使用。

非阻塞NIO:使一个线程从某通道发送请求读取/写数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。

NIO的大致流程为:

输入文件->缓冲区->通道->缓冲区->程序处理数据->缓冲区->通道->缓冲区->输出文件。

I/O的大致流程为:

输入文件->流->程序处理数据->流->输出文件。

NIO I/O 比较,通道就像是流,区别是流是单向的,要不是输出流、要不是输入流。NIO可用于读、写还可以同时用于读写

8. Java NIO中最重要的通道的实现:

   (1).FileChannel 从文件中读写数据。

   (2).DatagramChannel 能通过UDP读写网络中的数据。

   (3).SocketChannel 能通过TCP读写网络中的数据。

   (4).ServerSocketChannel可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel。

9.文件的读写:(单纯的文件读写,可以用NIO,文件大的时候)

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


10.测试结果:(按照文件的大小分别测试。测试时间:毫秒)

336k

80449k=78G

476029k=464G

NIo时间是:45

NIo时间是:738

NIo时间是:9901

Io时间是:2

Io时间是:502

Io时间是:16825


你可能感兴趣的:(Java,NIO)