首页 课程 师资 教程 报名

Java Nio详解

  • 2022-07-25 11:00:01
  • 1259次 动力节点

Java NIO (New IO) 是 Java 的替代 IO API,意味着标准 Java IO和Java Networking API 的替代品。Java NIO 提供了与传统 IO API 不同的 IO 编程模型。注意:有时 NIO 被声称是指Non-blocking IO。然而,这并不是原本的意思。此外,NIO API 的某些部分实际上是阻塞的——例如文件 API——所以标签“非阻塞”会有点误导。

Java NIO:非阻塞 IO

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

Java NIO:通道和缓冲区

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

Java NIO:选择器

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

Java NIO 概述

Java NIO 由以下核心组件组成:

频道

缓冲器

选择器

Java NIO 有比这些更多的类和组件,但在我看来Channel,Buffer 和Selector构成了 API 的核心。其余的组件,例如 Pipe和FileLock只是与三个核心组件一起使用的实用程序类。因此,我将在本 NIO 概述中重点介绍这三个组件。其他组件在本教程其他地方的其自己的文本中进行了解释。请参阅本页右上角的菜单。

通道和缓冲区

通常,NIO 中的所有 IO 都以Channel. AChannel有点像流。从Channel数据中可以读入一个Buffer. 数据也可以从 aBuffer写入 a Channel。这是一个例子:

Java NIO:Channels将数据读入Buffers,Buffers将数据写入Channels

有几种Channel和Buffer类型。Channel以下是Java NIO 中的主要实现列表:

文件频道

数据报频道

套接字通道

服务器套接字通道

如您所见,这些通道涵盖了 UDP + TCP 网络 IO 和文件 IO。

这些类也有一些有趣的接口,但为了简单起见,我将把它们排除在 Java NIO 概述之外。在本 Java NIO 教程的其他文本中,将在相关的地方对它们进行解释。

Buffer以下是Java NIO 中的核心实现列表:

字节缓冲区

字符缓冲区

双缓冲

浮动缓冲区

整数缓冲区

长缓冲区

短缓冲

这些Buffer涵盖了您可以通过 IO 发送的基本数据类型:byte、short、int、long、float、double 和 characters。

Java NIO 还有一个MappedByteBuffer与内存映射文件一起使用的。不过,我将把它Buffer排除在概述之外。

选择器

ASelector允许单个线程处理多个Channel's。如果您的应用程序打开了许多连接(通道),但每个连接上的流量很低,这会很方便。例如,在聊天服务器中。

这是使用 aSelector处理 3的线程的图示Channel:

要使用 a Selector,您可以使用它注册Channel's。然后你称之为 select()方法。此方法将阻塞,直到有一个已注册通道的事件准备好。一旦方法返回,线程就可以处理这些事件。事件的示例是传入连接、接收到的数据等。

通过上述介绍,相信大家对Java Nio已经有所了解,大家如果想了解更多相关知识,可以关注一下动力节点的Java基础教程,里面有更丰富的知识等着大家去学习,希望对大家能够有所帮助。

选你想看

你适合学Java吗?4大专业测评方法

代码逻辑 吸收能力 技术学习能力 综合素质

先测评确定适合在学习

在线申请免费测试名额
价值1998元实验班免费学
姓名
手机
提交