我正在阅读Thinking in Java这本书,其中提到了关于 File 的 JDK 1.4 java.nio* 并说 File NIO 比 File IO 快,并且旧的 IO 包已经使用 NIO 重新实现,所以现在 IO 更快。
这是真的?NIO 和 IO 到底指的是什么?我猜应该和JVM的运行以及操作系统有关,因为我在JDK源码的IO包中没有找到NIO的信息。你能解释一下NIO在这里指的是什么吗?为什么比IO快?
我正在阅读Thinking in Java这本书,其中提到了关于 File 的 JDK 1.4 java.nio* 并说 File NIO 比 File IO 快,并且旧的 IO 包已经使用 NIO 重新实现,所以现在 IO 更快。
这是真的?NIO 和 IO 到底指的是什么?我猜应该和JVM的运行以及操作系统有关,因为我在JDK源码的IO包中没有找到NIO的信息。你能解释一下NIO在这里指的是什么吗?为什么比IO快?
这本书的确切引用似乎是
JDK 1.4 中的包中引入的 Java“新”I/O 库
java.nio.*有一个目标:速度。事实上,“旧”I/O 包已经使用nio重新实现,以便利用这种速度提升,因此即使您没有明确使用nio编写代码,您也会受益。
(Java 中的思考,第 4版,第 679 页)
这比你的解释清楚一点。此外,出现的章节的开头(“I/O”)明确定义了术语“I/O”和“nio”。
NIO 和 IO 到底指的是什么?
“I/O”是“输入/输出”的常见计算机术语,Eckles 在这个意义上使用它。“nio”专门指java.nio.*Java 标准库的类,它们是 Java 1.4 的新内容。像许多其他人一样,Eckles 将“n”与“new”相关联,尽管 Oracle(当时的 Sun)似乎已经考虑了更专业的术语“非阻塞”。Eckles 谈到“'旧' I/O 包”时主要指的是java.io.*类(实际上只有一个包),他刚刚花了 30 页讨论了这些类。
为什么比IO快?
根据埃克尔斯的说法:
速度来自使用更接近操作系统执行 I/O 方式的结构:通道和缓冲区。
如果这对您没有意义,那么您可能需要研究他所指的低级细节。但是,您可以从nio类的细节中了解它们,Eckles 将在本书接下来的 18 页中专门介绍它们。
这是真的[
java.io.*类受益于nio ]?
这个断言对我来说似乎完全合理。我无法轻松访问 Java 1.4 源代码,但我花了大约一分钟的时间谷歌了java.io.FileInputStream源代码,并发现在我查看的第一个版本(来自 OpenJDK 7)中,虽然关键位是本机的,但类确实是按照nio类来实现的java.nio.channels.FileChannel。
Java IO 是指 Java 输入/输出 API。它的设计是……处理输入和输出。
Java NIO 是 IO 的重新实现,Non-blocking IO。它被认为更快。
我不知道 IO 是否在任何时候被重新实现(尽管这是您所要求的),我只能假设您误读了它,实际上 NIO 是 IO 的重新实现。书中的片段可以更好地澄清它。
ps:它是对库的重新实现,以不同的方式实现,但通常做同样的事情