2014-08-27 24 views
52

我不太明白他们彼此有什么不同,所以我对这两个软件包有一些疑问。Java:NIO和NIO.2究竟有什么区别?

在谷歌环顾了一下后,似乎甲骨文决定更新NIO包,使用更新的增强版NIO.2包作为JDK7发行版的一部分。

  1. NIO包的性能如何与NIO.2包进行比较?
  2. NIONIO.2有什么重大变化? (例如新方法,特征)
  3. 为什么原始NIO包必须更新?
  4. NIO.2现在只是NIO包的代名词吗?

这不是我想在我的代码中使用遗留软件包,我只是很好奇这件事。请告诉我他们的区别?

+1

NIO2引入了异步I/O和java.nio.files包。 – EJP 2014-08-27 22:21:00

+0

是吗?我有一个印象NIO.2是巨大的。 – 2014-08-27 22:28:32

+0

首先他们有IO。然后他们介绍了“新IO”。然后他们想要引入更多功能,所以他们巧妙地将其命名为“New IO 2”。 – Kayaman 2014-08-27 22:37:07

回答

51

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

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

为了克服这些问题,java.nio包在Java被引入4的主要功能是:

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

与Java 7 java.nio.file包被引入用于处理符号链接提供了更好的支撑,文件属性访问,并特别支持通过路径,路径和文件等类扩展文件系统。您可能想看看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和图莎尔夏尔马 - 第9章]

33

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。

+1

永不言败。有许多基于Windows的服务器正在使用中,特别是当预计的工作负载不高时。 – 2017-02-17 13:34:32

相关问题