我不太明白它们彼此有多么不同,所以我对这两个包有一些疑问。
在谷歌上看一下之后,似乎Oracle决定使用更新且增强的NIO
软件包更新NIO.2
软件包,作为JDK7版本的一部分。
NIO
包的效果与NIO.2
包的比较结果如何?NIO
到NIO.2
有哪些重大变化? (例如新方法,特征)NIO
包必须更新?NIO.2
现在只是NIO
包的同义词吗? 这不是我想在我的代码中使用遗留包,我只是对此非常好奇。请告诉我他们的不同之处?
答案 0 :(得分:72)
Java最初是通过在File
包中提供java.io
类来访问文件系统而开始的。此对象表示文件/目录,并允许您执行某些操作,例如检查文件/目录是否存在,获取属性并将其删除。但是,它有一些缺点。仅举几例:
boolean
的方法。可以想象,如果出现错误,则返回false
,而不是抛出异常。事实上,开发人员无法知道失败的原因。为了克服这些问题,在java 4中引入了java.nio包。主要功能是:
使用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认证专业Java SE7 - 全面的OCJP7认证指南, 作者:S.G.Ganesh和Tushar Sharma - 第9章]
答案 1 :(得分:43)
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。
答案 2 :(得分:1)
我的看法:
简短版本
它是对java.nio.file软件包的补充,它具有高级的大大增强的文件和文件系统功能。
从网络套接字或低级别文件访问的角度来看,NIO == NIO.2,具有一些便利性改进。
长版
包装:java.io
旧的阻塞I / O API
在Java 1.4中添加了新的非阻塞API。
包裹:java.nio
Java非阻塞IO。诸如Selector
,SelectorKey
,Channel
之类的类。
在我看来,NIO对于网络I / O(Selector
,SelectorKey
,SocketChannel
,ServerSocketChannel
,Buffer
)来说是一大进步用于文件I / O(仅FileChannel
和Buffer
,包括内存映射文件)。
对于网络和文件部分,这是一个相当低级的API。
在Java 7中添加。主要是关于添加大大改进的文件和文件系统操作以及寻址API的信息。新的文件和文件系统相关的API相对较高。
包装:java.nio.file
,并为父产品java.nio
添加了少量包装。
这些添加是针对文件I / O的,并且仅对网络I / O或低级文件API进行了少量的添加。
最显着的低级,与文件无关的API添加为AsynchronousSocketChannel
,AsynchronousServerSocketChannel
和AsynchronousFileChannel
,它们向某些方法添加了回调变体。的异步版本主要是为了方便起见;这样的映射接口本来可以被黑客入侵,但是现在它们可以在JRE中直接使用。
新的文件API带来了很多好处-使用Path可以处理更多有用的文件系统,使用自定义文件系统提供程序可以改善ZIP文件的操作,具有特殊的文件属性访问权限,可以使用多种便利方法,例如使用一个命令读取整个文件用一个命令等复制文件。但这与文件/文件系统有关,而且都相当高级。
从网络套接字或低级别文件访问的角度,我重申了上面的内容,NIO == NIO.2
相关链接