Java:NIO和NIO.2之间到底有什么区别?

2022-08-31 11:08:20

我不太明白它们彼此之间有多大的不同,所以我对这两个软件包有一些询问。

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

  1. 封装的性能与封装相比如何?NIONIO.2
  2. 从 到 有哪些重大变化?(例如,新方法、新功能)NIONIO.2
  3. 为什么原始软件包必须更新?NIO
  4. 现在只是包装的同义词吗?NIO.2NIO

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


答案 1

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

  • File 类缺少一些重要的功能,如复制方法。
  • 它还定义了许多返回 .可以想象,在发生错误的情况下,返回,而不是引发异常。事实上,开发人员无法知道为什么会失败。booleanfalse
  • 没有对符号链接的支持提供良好的处理。
  • 提供了一组有限的文件属性。

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

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

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

考虑到这一点:

从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 引入了异步 i/o

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

NIO:选择器/反应器模式

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

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


推荐