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

时间:2012-04-29 12:17:32

标签: java nio java.nio.file

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

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

5 个答案:

答案 0 :(得分:17)

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

This article解释了包中的差异以及阻塞和非阻塞IO是什么。

答案 1 :(得分:11)

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不易处理

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

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

    值得一读Pain points with java.nio

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

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

    如果您正在与NIO合作,请务必解决差异,哪一个适合您的目的。

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:0)

NIO还引入了渠道,这些渠道抽象出Stream - File,Socket,Network中的专业化。