Java:NIO和NIO.2的区别究竟是什么?
我不太明白他们彼此有什么不同,所以我对这两个软件包有一些疑问。
在Google上查看一下后,似乎Oracle决定使用更新的,增强的NIO.2
软件包来更新NIO
软件包,作为JDK7版本的一部分。
-
NIO
软件包的性能与NIO.2
软件包相比如何? - 从
NIO
到NIO.2
什么大的变化? (如新的方法,function) - 为什么最初的
NIO
包需要更新? -
NIO.2
现在是NIO
套餐的代名词吗?
这不是我想要在我的代码中使用旧的包,我只是很好奇这一点。 请告诉我他们的区别?
Java最初通过在java.io
包中提供File
类来访问文件系统。 这个对象代表一个文件/目录,并允许你执行一些操作,如检查一个文件/目录是否存在,获取属性并删除它。 但它有一些缺点。 仅举几例:
- File类缺less一些重要的function,例如复制方法。
- 它还定义了许多返回
boolean
方法。 可以想象,如果发生错误,则返回false
,而不是抛出exception。 开发者确实无法知道为什么失败。 - 没有提供良好的符号链接支持处理。
- 提供了一组有限的文件属性。
为了克服这些问题,在java 4中引入了java.nio包,主要特点是:
- 通道和select器:通道是对较低级文件系统function的抽象,例如内存映射文件。
- 缓冲区:缓冲所有原始类(布尔除外)。
- 字符集:Charset(java.nio.charset),编码器和解码器来映射字节和Unicode符号
使用java 7引入了java.nio.file包,为处理符号链接,文件属性访问提供了更好的支持,并特别支持通过诸如Path,Paths和Files之类的类来扩展文件系统。 你可能想看看java.nio.file包的描述,以获得更多的细节。
考虑到这一点:
从NIO到NIO.2有什么大的变化? (如新的方法,function)?
他们服务不同的目的。 要指出很大的改变,你可能想看看全新的包java.nio.file
。
为什么最初的NIO包需要更新?
它没有。 一个新的包被引入,而不是更新。
NIO.2现在是NIO套餐的代名词吗? NIO软件包的性能与NIO.2软件包相比如何?
不,他们不是同义词。 比较它们之间的性能也是没有什么意义的,因为它们服务于不同的目的。 NIO更抽象的低级别数据I / O和NIO2专注于文件pipe理。
希望这可以帮助。
[参考书目:Oracleauthentication专业Java SE7 – 全面的OCJP7authentication指南,由SGGanesh和Tushar Sharma撰写 – 第9章]
NIO.2引入了asynchronousI / O。
asynchronousI / O是一种不受NIO支持的非阻塞I / O的方法。
NIO:select器/反应堆模式
NIO.2:完成处理程序/ 反应器模式
因此,在Windows上, NIO.2使用I / O完成端口 ,这应该会提升性能。 除了没有人知道,因为没有人在服务器端使用Windows,如果他们这样做,他们可能会这样做,因为他们大量投资.net,因此很可能不会考虑使用Java。