当 io 包已经提供了方法时,java nio 包的确切用途是什么

问题描述 投票:0回答:5

我正在学习 java nio 包,我意识到 File 已经提供了很多方法,nio.Files 通过使用 Path 类再次提供。就像我得到的那几个一样。 我实际上不明白 nio 包的实际用途是什么。

我对这个软件包非常陌生,所以可能我的问题是错误的,但一点帮助可以促进我进一步阅读。

java nio java.nio.file
5个回答
29
投票

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

这篇文章解释了软件包之间的差异以及什么是阻塞和非阻塞IO。 已存档 新网站


24
投票

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 每个套接字需要一个线程。编码将会变得更加容易。 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 合作,值得仔细研究其中的差异以及哪一个适合您的目的。


15
投票

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

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

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


2
投票

NIO 还引入了通道,抽象了流中的专业化 - 文件、套接字、网络。


2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.