IO与NIO的区别

125 阅读1分钟

首先,I/O,指的是 IO 流,它可以实现数据从磁盘中的读取以及写入。

实际上,除了磁盘以外,内存、网络都可以作为 I/O 流的数据来源和目的地。

在 Java 里面,提供了字符流字节流两种方式来实现数据流的操作。

其次,当程序是面向网络进行数据的 IO 操作的时候,Java 里面提供了 Socket

的方式来实现。

通过这种方式可以实现数据的网络传输。

基于 Socket 的 IO 通信,它是属于阻塞式 IO,也就是说,在连接以及 IO 事件

未就绪的情况下,当前的连接会处于阻塞等待的状态

image.png 如果一旦某个连接处于阻塞状态,那么后续的连接都得等待。所以服务端能够处 理的连接数量非常有限。

NIO,是 **JDK1.4 **里面新增的一种 NEW IO 机制,相比于传统的 IO,NIO 在效率 上做了很大的优化,并且新增了几个核心组件。

Channel、Buffer、Selectors。 另外,还提供了非阻塞的特性,所以,对于网络 IO 来说,NIO 通常也称为No-Block IO,非阻塞 IO。 也就是说,通过 NIO 进行网络数据传输的时候,如果连接未就绪或者 IO 事件未 就绪的情况下,服务端不会阻塞当前连接,而是继续去轮询后续的连接来处理。 所以在 NIO 里面,服务端能够并行处理的链接数量更多。

image.png 因此,总的来说,IO 和 NIO 的区别,站在网络 IO 的视角来说,前者是阻塞 IO, 后者是非阻塞 IO。