当io包中已有方法时,java nio包的确切用法是什么

我正在学习java nio包,我意识到文件已经提供了很多方法,nio.Files再次使用Path类提供这些方法。 就像我得到的那样。 我实际上没有得到nio包的实际用途。

我对这个软件包很新,所以可能我的问题是错的,但是一点帮助可以促使我进一步阅读。

IO和NIO之间的主要区别在于IO是阻塞的,而NIO是非阻塞的。

本文解释了包中的差异以及阻塞和非阻塞IO的含义。

Java编程,I / O直到最近才使用流隐喻进行。 所有I / O都被视为单个字节的移动,一次一个,通过一个名为Stream的对象。 流I / O用于联系外部世界。 它也在内部使用,用于将对象转换为字节,然后再转换回对象。

NIO与原始I / O具有相同的作用和目的,但它使用了不同的隐喻 – 块I / O. java.nio(新的/非阻塞的I / O))API是随JDK1.4引入的。

流I / O和块I / O有什么区别?

面向流的I / O系统一次处理一个字节的数据。 输入流产生一个字节的数据,输出流消耗一个字节的数据。 为流数据创建filter非常容易。 将几个filter链接在一起也是相对简单的,这样每个filter都可以完成一个相当复杂的处理机制。 另一方面,面向流的I / O通常相当慢。

面向块的I / O系统处理块中的数据。 每个操作一步产生或消耗一个数据块。 通过块处理数据比通过(流)字节处理数据快得多。 但是面向块的I / O缺乏面向流的I / O的优雅和简单性。

什么时候应该使用java.io,什么时候应该更喜欢java.nio?

  1. 可扩展性可能会推动您选择的包。 java.net每个socket需要一个线程。 编码它将更容易。 java.nio效率更高,但很难编码。

  2. 处理成千上万的连接后,您可以获得更好的可扩展性,但是数量越少,阻塞IO的吞吐量就越高。

  3. 使用SSL时,java.nio不是一件易于处理的事情

重要提示:如果您正在使用其中任何一个软件包,那么从头开始创建框架并不是一个好主意,除非您有令人信服的理由这样做。

对于java.nio,Grizzly和Quick Server等项目提供了可重用的非阻塞服务器组件。

值得阅读java.nio的痛点

最后,它归结为您的项目的具体要求以及您要实现的目标。 一些最佳解决方案可能不需要最复杂的基础设施

更新:最近发现了自jdk 1.7以来存在的NIO.2软件包。 NIO.2与NIO不同,主要是NIO.2提供异步通道function。 NIO.2引物

如果你正在与NIO合作,值得通过差异,哪一个适合你的目的。

Java NIO:频道和缓冲区
在标准IO API中,您使用字节流和字符流。 在NIO中,您使用通道和缓冲区。 数据总是从通道读入缓冲区,或从缓冲区写入通道。

Java NIO:非阻塞IO
Java NIO使您可以执行非阻塞IO。 例如,线程可以要求通道将数据读入缓冲区。 当通道将数据读入缓冲区时,线程可以执行其他操作。 一旦数据被读入缓冲区,线程就可以继续处理它。 将数据写入通道也是如此。

Java NIO:选择器
Java NIO包含“选择器”的概念。 选择器是一个可以监视多个事件通道的对象(例如:连接打开,数据到达等)。 因此,单个线程可以监视多个通道的数据。
orcale的更多细节

几乎java.io.File每个方法都存在由于兼容性原因而无法修复的问题,最明显的是方法在失败时返回一个boolean 。 这些问题以及支持可插拔文件系统和许多其他事情的需求需要开发一个全新的文件系统API,因此这就是创建java.nio.File原因。

NIO还引入了Channels,它们抽象出Stream – File,Socket,Network中的专业化。