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

时间:2014-08-27 22:02:22

标签: java io nio difference

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

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

  1. NIO包的效果与NIO.2包的比较结果如何?
  2. NIONIO.2有哪些重大变化? (例如新方法,特征)
  3. 为什么原始NIO包必须更新?
  4. NIO.2现在只是NIO包的同义词吗?
  5. 这不是我想在我的代码中使用遗留包,我只是对此非常好奇。请告诉我他们的不同之处?

3 个答案:

答案 0 :(得分:72)

Java最初是通过在File包中提供java.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 package description以获取有关此内容的更多详细信息。

考虑到这一点:

  

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

它们用于不同的目的。要指出大的更改,您可能需要查看全新的包java.nio.file

  

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

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

  

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

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

希望这有帮助。

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

答案 1 :(得分:43)

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。

答案 2 :(得分:1)

我的看法:

简短版本

它是对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(仅FileChannelBuffer,包括内存映射文件)。 对于网络和文件部分,这是一个相当低级的API。

Java NIO.2

在Java 7中添加。主要是关于添加大大改进的文件和文件系统操作以及寻址API的信息。新的文件和文件系统相关的API相对较高。

包装:java.nio.file,并为父产品java.nio添加了少量包装。
这些添加是针对文件I / O的,并且仅对网络I / O或低级文件API进行了少量的添加。

最显着的低级,与文件无关的API添加为AsynchronousSocketChannelAsynchronousServerSocketChannelAsynchronousFileChannel,它们向某些方法添加了回调变体。的异步版本主要是为了方便起见;这样的映射接口本来可以被黑客入侵,但是现在它们可以在JRE中直接使用。

新的文件API带来了很多好处-使用Path可以处理更多有用的文件系统,使用自定义文件系统提供程序可以改善ZIP文件的操作,具有特殊的文件属性访问权限,可以使用多种便利方法,例如使用一个命令读取整个文件用一个命令等复制文件。但这与文件/文件系统有关,而且都相当高级。

从网络套接字或低级别文件访问的角度,我重申了上面的内容,NIO == NIO.2

相关链接