NIO与IO的区别

  在Java1.4之前的I/O系统中,提供的都是面向流的I/O系统,系统一次一个字节地处理数据,一个输入流产生一个字节的数据,一个输出流消费一个字节的数据,面向流的I/O速度非常慢,而在Java 1.4中推出了NIO,这是一个面向块的I/O系统,系统以块的方式处理处理,每一个操作在一步中产生或者消费一个数据块,按块处理要比按字节处理数据快的多。

  NIO与IO有相同的作用,但NIO支持面向缓冲区的、基于通道的IO操作,NIO将更加高效的读写操作。

NIO与IO的区别

  (1)IO是面向流的,NIO是面向缓冲区的

  用IO进行数据读写时,数据库与程序之间会有一个流,可以理解为数据流动的管道,数据在这个管道中进行读写,并且这个管道是单向的,也就是说读的管道与写的是两个不同的管道,而且一个输入流产生一个字节的数据,一个输出流消费一个字节的数据,面向流的I/O速度非常慢。

  用NIO对数据读写时,数据库与程序之间会有一个通道,这个通道内部没有数据流动,只是作为缓冲区的载体,而缓冲区中存放了一定数量的数据在通道上流动,系统以块的方式处理处理,每一个操作在一步中产生或者消费一个数据块,按块处理要比按字节处理数据快的多。

  (2)IO是阻塞的,NIO是非阻塞的    

  传统的IO流都是阻塞的,即一个线程对数据进行读写时,该线程被阻塞,直到有一些数据被读取或写入,在此过程中,该线程不能执行其他任何任务(因此,在完成网络通信进行IO操作时,由于线程会阻塞,所以服务器端必须为每个客户端都提供一个独立的线程进行处理。当服务器需要处理大量客户端时,性能急剧下降)

  JAVA NIO 时非阻塞模式的,当线程从通道进行数据读写时,若没有数据可用时,该线程可以进行其他任务,线程通常将非阻塞IO空闲时间用于其他通道上执行IO操作,所有单独的线 程可以管理多个输入和输出通道,因此,NIO可以让服务器端使用一个或有限个线程来连接到服务器端的所有客户。

原文地址:https://www.cnblogs.com/xyzyj/p/7347573.html