Java:NIO 和 NIO.2 到底有啥区别?

Posted

技术标签:

【中文标题】Java:NIO 和 NIO.2 到底有啥区别?【英文标题】:Java: what exactly is the difference between NIO and NIO.2?Java:NIO 和 NIO.2 到底有什么区别? 【发布时间】:2014-10-21 15:49:10 【问题描述】:

我不太明白它们之间有什么不同,所以我对这两个包有一些疑问。

在 Google 上浏览了一下之后,似乎 Oracle 决定使用更新和增强的 NIO.2 软件包更新 NIO 软件包,作为 JDK7 版本的一部分。

    NIO 包的性能与NIO.2 包相比如何? 从NIONIO.2 有哪些重大变化? (例如新方法、新功能) 为什么必须更新原来的NIO 包? 现在NIO.2 只是NIO 包的同义词吗?

我并不是想在我的代码中使用 legacy 包,我只是对此很好奇。请告诉我他们的区别?

【问题讨论】:

NIO2 引入了异步 I/O 和 java.nio.files 包。 是这样吗?我的印象是 NIO.2 是一个巨大的东西。 首先他们有 IO。然后他们介绍了“新IO”。然后他们想引入更多功能,所以他们巧妙地将其命名为“New IO 2”。 谢谢,我想通了。那么这是否意味着“New IO 2”在各方面都优于其他两个?我正在阅读“The Java Tutorial”这本书,它讲授了 NIO.2,但它也有一个关于 IO 的部分。 @JohnHuynh 不,这意味着它引入了新功能。如果您不需要它们,请不要使用它们。 【参考方案1】:

Java 最初是通过在 java.io 包中提供 File 类来访问文件系统而开始的。该对象代表一个文件/目录,并允许您执行一些操作,例如检查文件/目录是否存在、获取属性并删除它。不过,它也有一些缺点。仅举几例:

File 类缺少一些重要的功能,例如复制方法。 它还定义了许多返回boolean 的方法。可以想象,如果发生错误,false 会被返回,而不是抛出异常。开发人员确实无法知道失败的原因。 未提供对符号链接支持的良好处理。 提供了一组有限的文件属性。

为了克服这些问题,java 4 中引入了 java.nio 包。主要特点是:

通道和选择器:通道是对较低级别文件系统功能的抽象,例如内存映射文件。 缓冲区:所有原始类的缓冲(布尔值除外)。 字符集:用于映射字节和 Unicode 符号的字符集 (java.nio.charset)、编码器和解码器

在 java 7 中引入了 java.nio.file 包,为处理符号链接、文件属性访问提供了更好的支持,并特别支持通过 Path、Paths 和 Files 等类扩展文件系统。您可能想查看java.nio.file package description 以获取更多详细信息。

考虑到这一点:

从 NIO 到 NIO.2 有哪些重大变化? (例如新方法, 功能)?

它们有不同的用途。要指出重大变化,您可能需要查看全新软件包 java.nio.file

为什么要更新原来的 NIO 包?

它没有。引入而不是更新了一个新包。

现在 NIO.2 只是 NIO 包的代名词吗? NIO包的性能与NIO.2包相比如何?

不,它们不是同义词。比较它们之间的性能也没有多大意义,因为它们用于不同的目的。 NIO 是一种更抽象的低级数据 I/O,而 NIO2 则专注于文件管理。

希望这会有所帮助。

[参考书目:Oracle Certified Professional Java SE7 - 全面的 OCJP7 认证指南, S.G.Ganesh 和 Tushar Sharma - 第 9 章]

【讨论】:

【参考方案2】:

NIO.2 引入asynchronous i/o

异步 ​​I/O 是一种 NIO 不支持的非阻塞 I/O 方法。

NIO:选择器/反应器模式

NIO.2:完成处理程序/proactor pattern

因此,当在 Windows 上时,NIO.2 uses I/O Completion Ports,应该会提高性能。除了,没有人知道,因为没有人在服务器端使用 Windows,如果他们这样做,他们可能这样做是因为他们在 .net 上投入了大量资金,因此很可能不会考虑使用 Java。

【讨论】:

永远不要说永远。有许多基于 Windows 的服务器正在使用中,尤其是在预计的工作负载不那么高的情况下。 reactor vs proactor 是我最注意到的 我的公司有很多 Windows 服务器,这是一家领先的金融机构,我们主要使用 Java。【参考方案3】:

我的看法:

短版

它是 java.nio.file 包的添加,它具有高度增强的高级文件和文件系统功能。 从网络套接字或低级文件访问的角度来看,NIO == NIO.2 具有一些便利性改进。

加长版

Java IO

包裹:java.io 旧的阻塞 I/O API

Java NIO

在 Java 1.4 中添加了新的非阻塞 API。 包:java.nio Java 非阻塞 IO。 SelectorSelectorKeyChannel 等类。 在我看来,NIO 是网络 I/O 的一大步(SelectorSelectorKeySocketChannelServerSocketChannelBuffer),对于文件 I/O(FileChannel 和仅限Buffer,包括内存映射文件)。 这是一个相当低级的 API,适用于网络和文件部分。

Java NIO.2

在 Java 7 中添加。它主要是关于添加大大改进的文件和文件系统操作和寻址 API。新的文件和文件系统相关的API是比较高级的。

包:java.nio.file 和父级java.nio 的一些补充。 此添加用于文件 I/O,仅对网络 I/O 或低级文件 API 进行了少量添加。

最值得注意的低级、非必要文件相关的 API 添加是 AsynchronousSocketChannelAsynchronousServerSocketChannelAsynchronousFileChannel,它们为某些方法添加了回调变体。的异步版本主要是为了方便添加;此类映射接口甚至可以在以前被破解,但现在它们在 JRE 中开箱即用。

新的文件 API 带来了很多好东西——更有用的文件系统寻址,使用自定义文件系统提供程序,大大改进了 ZIP 文件操作,特殊文件属性访问,许多方便的方法,比如用一个命令读取整个文件,用一个命令等复制文件。但它都是文件/文件系统相关的,而且都是相当高级的。

重申我上面已经说过的,从网络套接字或低级文件访问的角度来看,NIO == NIO.2

相关链接

Java NIO - non-blocking channels vs AsynchronousChannels 误导性命名的问题; Channel 和 Socket 的同步和异步变体确实是非阻塞的。 https://docs.oracle.com/javase/7/docs/technotes/guides/io/enhancements.html#jdk7 – 仅提及 NIO.2 部分下与文件相关的更改。

【讨论】:

以上是关于Java:NIO 和 NIO.2 到底有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Java NIO 中的 ByteBuffer 和 CharBuffer 有啥区别?

java中的NIO和IO到底是什么区别?20个问题告诉你答案

java中的NIO和IO到底是什么区别?20个问题告诉你答案

Nio2Endpoint组件:Tomcat如何实现异步I/O?

I/O NIO 2

12NIO--PathPathsFiles