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
包相比如何?
从NIO
到NIO.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
类来访问文件系统而开始的。该对象代表一个文件/目录,并允许您执行一些操作,例如检查文件/目录是否存在、获取属性并删除它。不过,它也有一些缺点。仅举几例:
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。 Selector
、SelectorKey
、Channel
等类。
在我看来,NIO 是网络 I/O 的一大步(Selector
、SelectorKey
、SocketChannel
、ServerSocketChannel
、Buffer
),对于文件 I/O(FileChannel
和仅限Buffer
,包括内存映射文件)。
这是一个相当低级的 API,适用于网络和文件部分。
Java NIO.2
在 Java 7 中添加。它主要是关于添加大大改进的文件和文件系统操作和寻址 API。新的文件和文件系统相关的API是比较高级的。
包:java.nio.file
和父级java.nio
的一些补充。
此添加用于文件 I/O,仅对网络 I/O 或低级文件 API 进行了少量添加。
最值得注意的低级、非必要文件相关的 API 添加是 AsynchronousSocketChannel
、AsynchronousServerSocketChannel
和 AsynchronousFileChannel
,它们为某些方法添加了回调变体。的异步版本主要是为了方便添加;此类映射接口甚至可以在以前被破解,但现在它们在 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个问题告诉你答案