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 stands for Java Input Output | Java NIO stands for Java New Input Output | ||
Java IO operates inside java.io package | Java NIO operates inside java.nio package | ||
Java IO is Stream oriented | Java NIO is Buffer oriented | ||
Blocking IO operation | Non-blocking IO operation | ||
Channels are not available | Channels are available | It deals with data in stream | It deals with data in blocks |
Does not contain the concept of Selectors | Contains the concept of Selectors |