Java:NIO和NIO.2的区别究竟是什么?

Joh*_*ynh 72 java io nio difference

我不太明白它们彼此有多么不同,所以我对这两个包有一些疑问.

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

  1. NIO包的性能与包相比如何NIO.2
  2. 什么是从一些大的变化NIONIO.2?(例如新方法,功能)
  3. 为什么原始NIO包必须更新?
  4. 现在NIO.2只是NIO包的代名词吗?

这不是我想在我的代码中使用遗留包,我只是对此非常好奇.请告诉我他们的不同之处?

小智 79

Java最初是通过Filejava.io包中提供类来访问文件系统而开始的.此对象表示文件/目录,并允许您执行某些操作,例如检查文件/目录是否存在,获取属性并将其删除.但是,它有一些缺点.仅举几例:

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

为了克服这些问题,在java 4中引入了java.nio包.主要功能包括:

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

使用java 7,引入了java.nio.file包,为处理符号链接,文件属性访问提供了更好的支持,并特别支持通过Path,Paths和Files等类扩展文件系统.您可能希望查看java.nio.file包描述以获取有关此内容的更多详细信息.

考虑到这一点:

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

它们用于不同的目的.要指出大的变化,你可能想看看全新的包java.nio.file.

为什么原始的NIO包必须更新?

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

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

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

希望这可以帮助.

[参考书目:Oracle认证专业Java SE7 - 由SGGanesh和Tushar Sharma撰写的全面的OCJP7认证指南 - 第9章]


Eug*_*sky 46

NIO.2引入了异步i/o.

异步I/O是NIO不支持的非阻塞i/o的方法.

NIO:选择器/反应器模式

NIO.2:完成处理程序/ 主动模式

因此,在Windows上,NIO.2使用I/O完成端口,这将提高性能.除此之外,没有人知道,因为没有人在服务器端使用Windows,如果他们这样做,他们可能会这样做,因为他们大量投资于.net,因此很可能不会考虑使用Java.

  • 永远不要把话说绝了.有许多基于Windows的服务器正在使用中,尤其是当预计的工作负载不是很高时. (2认同)
  • 我的公司有很多 Windows 服务器,这是一家领先的金融机构,我们主要使用 Java。 (2认同)

Esp*_*osa 9

我的看法:

精简版

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

更长的版本

Java IO

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

蔚来

在 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 是比较高级的。

Package:java.nio.file以及对 parent 的一些补充java.nio
这些添加用于文件 I/O,并且仅对网络 I/O 或低级文件 API 进行了少量添加。

最显着的低级、与文件无关的 API 新增功能是AsynchronousSocketChannel,AsynchronousServerSocketChannelAsynchronousFileChannel,它们为某些方法添加了回调变体。的异步版本主要是一个方便的补充;这样的映射接口甚至在以前就可以被破解,但现在它们在 JRE 中开箱即用。

新的文件 API 带来了很多好处 - 使用 Path 更有用的文件系统寻址,使用自定义文件系统提供程序大大改进了 ZIP 文件操作,特殊文件属性访问,许多方便的方法,例如使用一个命令读取整个文件,使用一个命令等。但它与所有文件/文件系统相关,并且都非常高。

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

相关链接