Java IO 和 Java NIO 的区别
Java IO(输入/输出)用于执行读写操作。 java.io
包包含输入和输出操作所需的所有类。而 Java NIO(New IO)是从 JDK 4 引入的,用于实现高速 IO 操作。它是标准 IO API 的替代方案。本文将讨论这两种 IO 包的区别。
在深入了解 java IO 和 Java NIO 之间的区别之前,我们需要了解一些区分这两个 I/O 包的关键概念:
面向流与面向缓冲区的包:
Java IO 是一个面向流的包,这意味着它可以一次从流中读取一个或多个字节。它使用流在数据源/接收器和 java 程序之间传输数据。它是单向数据传输。下图说明了一个面向流的包:
与 Java IO 不同,Java NIO 是一个面向缓冲区的包。这意味着数据被读入缓冲区,使用通道进一步处理数据。例如,一个线程要求通道将数据读入缓冲区,当通道同时将数据读入缓冲区时,该线程可以进行其他工作。一旦数据被读入缓冲区,线程就可以继续处理它在读操作期间留下的工作。因此,NIO 是双向数据传输。下图说明了一个面向缓冲区的包:
阻塞 IO 与非阻塞 IO 包:
Java IO 是阻塞 IO。这意味着如果一个线程正在调用 read()
或 write()
操作,该线程将被阻塞,直到有一些数据要读取或数据被完全写入。这就是为什么它是同步 IO 或阻塞 IO。
与 Java IO 不同,Java NIO 是非阻塞 IO。这意味着如果一个线程正在调用 read()
或 write()
操作,则该线程不会被阻塞,直到有一些数据要读取或数据被完全写入,而不是线程继续执行其他操作。这就是为什么它是异步 IO 或非阻塞 IO。
通道:
通道是实体和缓冲区之间进行有效数据传输的媒介。它充当与数据源/接收器的开放连接的网关。
选择器:
选择器使用单个线程在多个 IO 通道中选择通道。
下表说明了 Java IO 和 Java NIO 之间的区别:
Java IO | Java NIO |
---|---|
Java IO 代表 Java 输入输出 | Java NIO 代表 Java 新输入输出 |
Java IO 在 java.io 包中运行 |
Java NIO 在 java.nio 包中运行 |
Java IO 是面向流的 | Java NIO 是面向缓冲区的 |
阻塞 IO 操作 | 非阻塞 IO 操作 |
通道不可用 | 通道可用 |
它处理流中的数据 | 它处理块中的数据 |
不包含 Selectors 的概念 | 包含 Selectors 的概念 |