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

Abh*_*ary 37 java nio java.nio.file

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

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

Dec*_*eco 22

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

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

  • 请不要只发布一个链接.当该链接死亡时,这个答案也是如此. (43认同)
  • NIO可以是阻塞,非阻塞或异步.这根本不是主要的区别. (5认同)

vsi*_*ngh 14

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系统一次处理一个字节的数据.输入流产生一个字节的数据,输出流消耗一个字节的数据.为流数据创建过滤器非常容易.将几个过滤器链接在一起也是相对简单的,这样每个过滤器就可以完成一个相当于单一,复杂的处理机制的部分.另一方面,面向流的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提供异步通道功能.NIO.2引物

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


Jit*_*dra 8

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

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

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