📜  Java IO 和Java NIO 的区别

📅  最后修改于: 2021-09-16 10:21:46             🧑  作者: Mango

Java IO (输入/输出)用于执行读写操作。 Java.io 包包含输入和输出操作所需的所有类。而Java NIO (New IO)是从 JDK 4 引入的,用于实现高速 IO 操作。它是标准 IO API 的替代品。在本文中,讨论了这两种 IO 包之间的区别。

在深入探讨Java IO 和Java NIO 之间的区别之前,我们需要了解一些区分 I/O 包的关键概念:

  1. 面向流与面向缓冲区的包:

    Java IO 是一个面向流的包,这意味着它可以一次从流中读取一个或多个字节。它使用流在数据源/接收器和Java程序之间传输数据。它是单向数据传输。下图说明了一个面向流的包:

    与Java IO 不同, Java NIO 是一个面向缓冲区的包。这意味着数据被读入缓冲区,并使用通道从缓冲区进行进一步处理。例如,一个线程要求通道将数据读入缓冲区,而当通道同时将数据读入缓冲区时,线程可以进行其他一些工作。一旦数据被读入缓冲区,线程就可以继续处理它在读操作期间留下的工作。因此,NIO 是双向数据传输。下图说明了一个面向缓冲区的包:

  2. 阻塞 IO 与非阻塞 IO 包:

    Java IO 是阻塞 IO。这意味着如果一个线程正在调用 read() 或 write() 操作,该线程将被阻塞,直到有一些数据要读取或数据被完全写入。这就是为什么它是同步 IO 或阻塞 IO。

    与Java IO 不同, Java NIO 是一种非阻塞 IO。这意味着如果一个线程正在调用 read() 或 write() 操作,则该线程不会被阻塞,直到有一些数据要读取或数据被完全写入,而不是线程继续执行其他操作。这就是为什么它是异步 IO 或非阻塞 IO。

  3. 频道:

    通道是实体和缓冲区之间有效数据传输的媒介。它充当与数据源/接收器开放连接的网关。

  4. 选择器:

    选择器使用单线程在多个 IO 通道中选择通道。

下表说明了Java IOJava 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