当io包已经可以使用方法时,java nio包的确切用途是什么

2022-08-31 22:33:30

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

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


答案 1

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

本文介绍了程序包中的差异以及什么是阻塞和非阻塞 IO。存档


答案 2

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合作,那么值得了解差异,哪一个适合您的目的。


推荐