【问题标题】:Java: what exactly is the difference between NIO and NIO.2?Java:NIO 和 NIO.2 到底有什么区别?
【发布时间】:2014-10-21 15:49:10
【问题描述】:

我不太明白它们之间有什么不同,所以我对这两个包有一些疑问。

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

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

我并不是想在我的代码中使用 legacy 包,我只是对此很好奇。请告诉我他们的区别?

【问题讨论】:

  • NIO2 引入了异步 I/O 和 java.nio.files 包。
  • 是这样吗?我的印象是 NIO.2 是一个巨大的东西。
  • 首先他们有 IO。然后他们介绍了“新IO”。然后他们想引入更多功能,所以他们巧妙地将其命名为“New IO 2”。
  • 谢谢,我想通了。那么这是否意味着“New IO 2”在各方面都优于其他两个?我正在阅读“The Java Tutorial”这本书,它讲授了 NIO.2,但它也有一个关于 IO 的部分。
  • @JohnHuynh 不,这意味着它引入了新功能。如果您不需要它们,请不要使用它们。

标签: java io nio difference


【解决方案1】:

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

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

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

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

在 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 Certified Professional Java SE7 - 全面的 OCJP7 认证指南, S.G.Ganesh 和 Tushar Sharma - 第 9 章]

【讨论】:

    【解决方案2】:

    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。

    【讨论】:

    • 永远不要说永远。有许多基于 Windows 的服务器正在使用中,尤其是在预计的工作负载不那么高的情况下。
    • reactor vs proactor 是我最注意到的
    • 我的公司有很多 Windows 服务器,这是一家领先的金融机构,我们主要使用 Java。
    【解决方案3】:

    我的看法:

    短版

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

    Java NIO.2

    在 Java 7 中添加。它主要是关于添加大大改进的文件和文件系统操作和寻址 API。新的文件和文件系统相关的API是比较高级的。

    包:java.nio.file 和父级java.nio 的一些补充。
    此添加用于文件 I/O,仅对网络 I/O 或低级文件 API 进行了少量添加。

    最值得注意的低级、非必要文件相关的 API 添加是 AsynchronousSocketChannelAsynchronousServerSocketChannelAsynchronousFileChannel,它们为某些方法添加了回调变体。的异步版本主要是为了方便添加;此类映射接口甚至可以在以前被破解,但现在它们在 JRE 中开箱即用。

    新的文件 API 带来了很多好东西——更有用的文件系统寻址,使用自定义文件系统提供程序,大大改进了 ZIP 文件操作,特殊文件属性访问,许多方便的方法,比如用一个命令读取整个文件,用一个命令等复制文件。但它都是文件/文件系统相关的,而且都是相当高级的。

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

    相关链接

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-02
      • 1970-01-01
      • 2016-05-15
      • 1970-01-01
      • 2012-06-17
      • 1970-01-01
      • 1970-01-01
      • 2016-08-12
      相关资源
      最近更新 更多