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

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

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

  1. NIO软件包的性能与NIO.2软件包相比如何?
  2. NIONIO.2什么大的变化? (如新的方法,function)
  3. 为什么最初的NIO包需要更新?
  4. NIO.2现在是NIO套餐的代名词吗?

这不是我想要在我的代码中使用旧的包,我只是很好奇这一点。 请告诉我他们的区别?

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

  • File类缺less一些重要的function,例如复制方法。
  • 它还定义了许多返回boolean方法。 可以想象,如果发生错误,则返回false ,而不是抛出exception。 开发者确实无法知道为什么失败。
  • 没有提供良好的符号链接支持处理。
  • 提供了一组有限的文件属性。

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

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

使用java 7引入了java.nio.file包,为处理符号链接,文件属性访问提供了更好的支持,并特别支持通过诸如Path,Paths和Files之类的类来扩展文件系统。 你可能想看看java.nio.file包的描述,以获得更多的细节。

考虑到这一点:

从NIO到NIO.2有什么大的变化? (如新的方法,function)?

他们服务不同的目的。 要指出很大的改变,你可能想看看全新的包java.nio.file

为什么最初的NIO包需要更新?

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

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

不,他们不是同义词。 比较它们之间的性能也是没有什么意义的,因为它们服务于不同的目的。 NIO更抽象的低级别数据I / O和NIO2专注于文件pipe理。

希望这可以帮助。

[参考书目:Oracleauthentication专业Java SE7 – 全面的OCJP7authentication指南,由SGGanesh和Tushar Sharma撰写 – 第9章]

NIO.2引入了asynchronousI / O。

asynchronousI / O是一种不受NIO支持的非阻塞I / O的方法。

NIO:select器/反应堆模式

NIO.2:完成处理程序/ 反应器模式

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