首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java: NIO和NIO.2到底有什么区别?

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

Stack Overflow用户
提问于 2014-08-27 22:02:21
回答 3查看 38.6K关注 0票数 92

我不太明白他们之间有多大的不同,所以我对这两个包裹有一些疑问。

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-28 00:57:54

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

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

为了克服这些问题,在java 4中引入了java.nio包。

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

在java 7中,引入了java.nio.file包,为处理符号链接、文件属性访问提供了更好的支持,并特别支持通过路径、路径和文件等类扩展文件系统。您可能想看看java.nio.file包描述,以获得更多关于这方面的详细信息。

考虑到这一点:

从NIO到NIO.2有什么重大变化?(例如新方法、新特性)?

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

为什么要更新原来的NIO包?

它没有。一个新的软件包被引进,而不是更新。

NIO.2只是现在NIO方案的同义词吗?与NIO.2包相比,NIO包的性能如何?

不,他们不是同义词。比较它们之间的性能也没有多大意义,因为它们的用途不同。NIO是一种比较抽象的底层数据I/O和NIO2,主要集中在文件管理上。

希望这能有所帮助。

参考书目: Oracle认证的专业Java SE7 -全面的OCJP7认证指南,由S.G.Ganesh和Tushar编写-第9章

票数 93
EN

Stack Overflow用户

发布于 2015-05-27 01:47:17

NIO.2介绍了 异步i/o.

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

NIO:选择器/反应器模式

NIO.2:完成处理程序/ 前置器模式

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

票数 66
EN

Stack Overflow用户

发布于 2019-09-03 19:51:40

我的看法:

短版

它增加了java.nio.file包的高级别,大大增强了文件和文件系统的功能。

从网络套接字或低级文件访问的角度来看,NIO == NIO.2有一些方便的改进。

更长版本

Java IO

包装:java.io

旧阻塞I/O API

Java NIO

在Java1.4中添加了新的非阻塞API。

包装:java.nio

Java非阻塞IO。SelectorSelectorKeyChannel这样的类。

在我看来,NIO对于网络I/O (SelectorSelectorKeySocketChannelServerSocketChannelBuffer)来说是一个很大的进步,尤其是对于文件I/O (仅限于FileChannelBuffer,包括内存映射文件)。对于网络和文件部分来说,这是一个相当低级别的API。

Java NIO.2

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

包:java.nio.file和很少添加到父java.nio

这些添加是针对文件I/O的,而对网络I/O或低级文件API的添加很少。

最显著的低级别,而不是必要的文件相关的API添加是AsynchronousSocketChannelAsynchronousServerSocketChannelAsynchronousFileChannel,它为一些方法添加了回调变体。异步版本主要是一种方便的添加;这种映射接口甚至可以在以前就被黑客入侵,但是现在它们在JRE中是现成的。

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

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

相关链接

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25537675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档