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

gev0vcfq  于 2022-12-25  发布在  Java
关注(0)|答案(3)|浏览(208)

我不太明白他们有什么不同,所以我有一些关于这两个软件包的查询。
在Google上浏览了一下之后,Oracle似乎决定用更新和增强的NIO.2包更新NIO包,作为JDK7版本的一部分。

  1. NIO封装的性能与NIO.2封装相比如何?
    1.从NIONIO.2有哪些重大变化?(例如,新方法、新特性)
    1.为什么必须更新原始的NIO软件包?
  2. NIO.2现在是否只是NIO包的同义词?
    这并不是说我想在我的代码中使用遗留包,我只是对此很好奇。请告诉我它们的区别?
wydwbb8l

wydwbb8l1#

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

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

为了克服这些问题,Java 4中引入了Java.nio包,其主要特性是:

  • 通道和选择器:通道是对较低级别文件系统特性的抽象,例如内存Map文件。
  • Buffers:为所有基元类(布尔类除外)提供缓冲。
  • Charset:Charset(java.nio.charset)、编码器和解码器,用于Map字节和Unicode符号

java7引入了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,而NIO 2侧重于文件管理。
[参考书目:Oracle认证MavenJava SE 7-全面的OCJP 7认证指南,作者:S.G.Ganesh和Tushar Sharma -第9章]

uurity8g

uurity8g2#

NIO.2引入了asynchronous i/o

异步I/O是NIO不支持的非阻塞I/O方法。
NIO:选择器/React器模式
NIO.2:完成处理程序/proactor pattern
因此,当在Windows上,NIO.2 uses I/O Completion Ports,这应该会提高性能。除了,没有人知道,因为没有人在服务器端使用Windows,如果他们这样做,他们可能这样做是因为他们在.net上投入巨资,因此很可能不会考虑使用Java。

1tuwyuhd

1tuwyuhd3#

我的看法:

    • 简短版本**

它是java.nio.file包的添加,具有高级的增强文件和文件系统功能。
从网络套接字或低级文件访问的Angular 来看,NIO == NIO.2有一些便利性的改进。

    • 加长版**

Java IO

Package :java.io
旧的阻塞I/O API

Java NIO

在Java 1.4中添加了新的非阻塞API。
Package :java.nio
Java非阻塞IO。SelectorSelectorKeyChannel等类。
在我看来,NIO对于网络I/O(SelectorSelectorKeySocketChannelServerSocketChannelBuffer)来说是一个很大的进步,对于文件I/O(仅FileChannelBuffer,包括内存Map文件)来说更是如此。

Java语言NIO.2

在Java7中增加的。主要是增加了很多改进的文件和文件系统操作和寻址API。新的文件和文件系统相关API是相对高级的。
封装:java.nio.file和对父级java.nio的少量添加。
这些添加是针对文件I/O的,仅对网络I/O或低级文件API进行了少量添加。
最值得注意的底层(不一定与文件相关)API添加是AsynchronousSocketChannelAsynchronousServerSocketChannelAsynchronousFileChannel,它们为一些方法添加了回调变量。这样的Map接口甚至在以前就可能被攻击到一起,但是现在它们在JRE中开箱即用。
新的文件API带来了很多好处-更有用的文件系统寻址路径,大大改善了ZIP文件操作使用自定义文件系统提供程序,特殊的文件属性访问,许多方便的方法,如读取整个文件与一个命令,复制文件与一个命令等,但它都是文件/文件系统相关的,都相当高的水平。
重申我上面已经说过的,从网络套接字或低级文件访问的Angular 来看,NIO == NIO.2

    • 相关链接**
  • Java NIO - non-blocking channels vs AsynchronousChannels误导性命名问题; Channel和Socket的同步和异步变体实际上都是非阻塞的。
  • https://docs.oracle.com/javase/7/docs/technotes/guides/io/enhancements.html#jdk7 – mentions only the file related changes under NIO.2 section.

相关问题