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

标签 java io nio difference

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

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

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

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

最佳答案

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

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

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

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

在 java 7 中引入了 java.nio.file 包,为处理符号链接(symbolic link)、文件属性访问提供了更好的支持,并特别支持通过 Path、Paths 和 Files 等类扩展文件系统。你可能想看看java.nio.file package description了解更多详情。

考虑到这一点:

What are some big changes from NIO to NIO.2? (e.g. new methods, features)?

它们有不同的用途。要指出重大变化,您可能需要查看全新的包 java.nio.file

Why did the original NIO package have to be updated?

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

Is NIO.2 just synonymous with the NIO package nowadays? How does the performance of NIO package compare with the NIO.2 package?

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

希望这会有所帮助。

[引用书目:Oracle Certified Professional Java SE7 - 全面的 OCJP7 认证指南, S.G.Ganesh 和 Tushar Sharma - 第 9 章]

关于Java:NIO 和 NIO.2 到底有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25537675/

相关文章:

java - 获取 JFrame 在平铺窗口管理器上显示 float

java - Vala 逐行读取文件

java - "system-dependent default"线程池是什么?

Java nio : How to add extension to an absolute path?

java - hibernate - session 已关闭

java - Springfox Swagger 将响应状态 200 添加到 POST 和 PUT

Java 的 createNewFile() - 它还会创建目录吗?

java - FileOutputStream 没有写入服务器上的磁盘?文件去哪里了?

java - 在单独线程上处理请求后写入非阻塞 NIO UDP (DatagramChannel) 套接字

java - NetBeans 内存不足错误