当前位置: 首页 > news >正文

Java的I/O类库- NIO

Java NIO(New I/O)是Java平台提供的一种用于非阻塞I/O操作的API。它引入了一组新的Java类,用于实现高性能的、非阻塞的I/O操作,以替代传统的阻塞式I/O(IO Blocking)模型。Java NIO的核心是基于Channel(通道)和Buffer(缓冲区)的I/O操作。
不但引人了全新的高效的I/O 机制,同时引人了基于 Reactor 设计模式的多路复用异步模式。NIO 的包中主要包含了以下几种抽象数据类型。

下面是一个简单的Java NIO服务器的示例,用于接收客户端的连接请求,并回显接收到的数据:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.channels.Selector;
import java.nio.channels.SelectionKey;
import java.util.Iterator;
import java.util.Set;public class NIOServer {public static void main(String[] args) throws IOException {// 创建一个SelectorSelector selector = Selector.open();// 创建ServerSocketChannel并绑定端口ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();serverSocketChannel.bind(new InetSocketAddress("localhost", 8888));serverSocketChannel.configureBlocking(false);// 将ServerSocketChannel注册到Selector,并监听连接事件serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);while (true) {// 等待事件发生selector.select();// 获取发生的事件集合Set<SelectionKey> selectedKeys = selector.selectedKeys();Iterator<SelectionKey> iterator = selectedKeys.iterator();while (iterator.hasNext()) {SelectionKey key = iterator.next();iterator.remove();// 处理连接事件if (key.isAcceptable()) {ServerSocketChannel serverChannel = (ServerSocketChannel) key.channel();SocketChannel clientChannel = serverChannel.accept();clientChannel.configureBlocking(false);clientChannel.register(selector, SelectionKey.OP_READ);}// 处理读取事件if (key.isReadable()) {SocketChannel clientChannel = (SocketChannel) key.channel();ByteBuffer buffer = ByteBuffer.allocate(1024);int bytesRead = clientChannel.read(buffer);if (bytesRead == -1) {clientChannel.close();} else if (bytesRead > 0) {buffer.flip();clientChannel.write(buffer);}}}}}
}

上述示例中,使用了ServerSocketChannel、SocketChannel和Selector来实现一个简单的NIO服务器。服务器接收客户端的连接请求,并回显接收到的数据。
Java NIO提供的主要特性包括:

  1. 通道和缓冲区:通道是数据源和数据目标的抽象表示,它类似于传统I/O中的流,但更加强大和灵活。缓冲区是用于在通道和应用程序之间传输数据的对象,它可以支持不同的数据类型和操作。

  2. 非阻塞I/O:与传统的阻塞I/O不同,Java NIO提供了非阻塞的I/O操作,允许应用程序在没有数据可用时继续执行其他任务,而不必等待I/O操作完成。

  3. 选择器(Selector):选择器是Java NIO中的一个重要组件,它允许一个线程同时监控多个通道的事件,如连接、接收、读取和写入等,从而有效地处理多个连接。

Java NIO的核心类主要在java.nio包中,例如ByteBufferChannelSelector等。使用Java NIO可以实现高性能的网络编程,尤其适用于需要处理大量连接的服务器应用程序。

在Java NIO(New I/O)中,ByteBuffer、Channel和Selector是三个核心概念,它们共同构成了非阻塞I/O模型的基础。

  1. ByteBuffer(缓冲区):
    ByteBuffer是Java NIO中用于进行数据传输的缓冲区。它类似于传统IO中的字节流,但更加灵活和高效。ByteBuffer是一个数组,可以存储原始字节数据,并提供了一系列方法用于读取和写入数据。在进行I/O操作时,数据通常先写入到ByteBuffer中,然后再从ByteBuffer中读取或传输到目标通道。

  2. Channel(通道):
    Channel是Java NIO中用于数据源和数据目标的抽象。Channel类似于传统IO中的流,但更加灵活。通道可以连接到文件、套接字或其他I/O源,并支持数据的读取和写入。Java NIO提供了不同类型的通道,例如FileChannel、SocketChannel、ServerSocketChannel等,用于不同类型的I/O操作。

  3. Selector(选择器):
    Selector是Java NIO中用于多路复用的关键组件。它允许一个线程同时监听多个通道的事件,如连接、读取、写入等,从而实现非阻塞I/O。Selector提供了高效的事件驱动机制,可以显著减少线程数,降低系统开销。Selector通常与非阻塞的Channel一起使用,通过调用Selector.select()方法来等待事件发生。

Java NIO的工作方式如下:

  1. 创建一个Selector,并将Channel注册到Selector上,监听感兴趣的事件,例如OP_READ、OP_WRITE等。
  2. 当有事件发生时,调用Selector.select()方法会返回,并返回事件的集合。
  3. 遍历事件集合,处理事件,如读取或写入数据。

以下是一个简单的Java NIO示例,演示如何使用ByteBuffer、Channel和Selector来实现非阻塞I/O:

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.Selector;
import java.nio.channels.SelectionKey;
import java.util.Iterator;
import java.net.InetSocketAddress;public class NIOExample {public static void main(String[] args) throws IOException {Selector selector = Selector.open();ServerSocketChannel serverChannel = ServerSocketChannel.open();serverChannel.bind(new InetSocketAddress("localhost", 8888));serverChannel.configureBlocking(false);serverChannel.register(selector, SelectionKey.OP_ACCEPT);while (true) {selector.select();Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();while (iterator.hasNext()) {SelectionKey key = iterator.next();iterator.remove();if (key.isAcceptable()) {ServerSocketChannel server = (ServerSocketChannel) key.channel();SocketChannel clientChannel = server.accept();clientChannel.configureBlocking(false);clientChannel.register(selector, SelectionKey.OP_READ);} else if (key.isReadable()) {SocketChannel clientChannel = (SocketChannel) key.channel();ByteBuffer buffer = ByteBuffer.allocate(1024);int bytesRead = clientChannel.read(buffer);if (bytesRead == -1) {clientChannel.close();} else if (bytesRead > 0) {buffer.flip();// 处理读取的数据while (buffer.hasRemaining()) {System.out.print((char) buffer.get());}System.out.println();}}}}}
}

上述示例中,通过使用ByteBuffer、Channel和Selector实现了一个简单的非阻塞的NIO服务器。服务器可以接收客户端的连接请求,并读取客户端发送的数据。这里只是一个简单示例,实际应用中可能需要更多的处理逻辑和异常处理。

Java NIO在网络编程、文件I/O和内存映射文件等场景下都能发挥强大的作用,特别适用于高性能、高并发的应用程序。

相关文章:

Java的I/O类库- NIO

Java NIO&#xff08;New I/O&#xff09;是Java平台提供的一种用于非阻塞I/O操作的API。它引入了一组新的Java类&#xff0c;用于实现高性能的、非阻塞的I/O操作&#xff0c;以替代传统的阻塞式I/O&#xff08;IO Blocking&#xff09;模型。Java NIO的核心是基于Channel&…...

【ASP.NET MVC】使用动软(三)(11)

一、问题 上文中提到&#xff0c;动软提供了数据库的基本操作功能&#xff0c;但是往往需要添加新的功能来解决实际问题&#xff0c;比如GetModel&#xff0c;通过id去查对象&#xff1a; 这个功能就需要进行改进&#xff1a;往往程序中获取的是实体的其他属性&#xff0c;比如…...

基于MATLAB长时间序列遥感数据植被物候提取与分析

MATLAB MATLAB是美国MathWorks公司出品的商业数学软件&#xff0c;用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人&#xff0c;控制系统等领域。 [1] MATLAB是matrix&laboratory两个词的组合&#xff0c;意为矩阵工厂&a…...

K8S deployment 重启的三种方法

一般重启deployment&#xff0c;常规操作是删掉对应的pod, 但如果有多个副本集的话&#xff0c;一个个删很麻烦。 除了删除pod&#xff0c;还可以&#xff1a; 方案一&#xff1a; 加上环境变量 kubectl patch deploy <deployment-name> -p {"spec":{"…...

解决Linux下PyCharm无法新建文件

一、问题描述 如图&#xff0c;在Ubuntu Linux系统中使用pycharm管理项目时&#xff0c;提示无法新建.py源文件&#xff1a; 二、问题解决 将问题定性为文件夹&#xff08;目录&#xff09;权限问题&#xff0c;在终端中打开项目文件夹的上级目录&#xff0c;将整个项目目录的…...

规则引擎技术解决方案

1 概述 1.1 规则引擎的背景 业务系统在应用过程中&#xff0c;常常包含着要处理“复杂、多变”的部分&#xff0c;这部分往往是“业务规则”或者是“数据的处理逻辑”。因此这部分的动态规则的问题&#xff0c;往往需要可配置&#xff0c;并对系统性能和热部署有一定的要求。从…...

2023奇安信天眼设备--面试题

1.在天眼分析平台网络协议中sip、dip、sport、dport字段表示的含义是什么&#xff1f; sip 源IP、dip 目的IP、sport 源端口、dport 目的端口 2.在天眼分析平台DNS协议中dns type字段表示的含义是? dns type表示DNS请求类型 0代表DNS请求&#xff0c;1代表DNS响应 3.dns_typ…...

【剑指Offer 58】 左旋转字符串,Java解密。

LeetCode 剑指Offer 75道练习题 文章目录 剑指Offer:左旋转字符串示例:限制:解题思路:剑指Offer:左旋转字符串 【题目描述】 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdef…...

Python SMTP发送邮件

Python SMTP发送邮件 SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则&#xff0c;由它来控制信件的中转方式。 python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的…...

Jmeter-获取接口响应头(Response headers)信息进行关联

文章目录 Jmeter-获取接口响应头&#xff08;Response headers&#xff09;信息进行关联使用正则表达式提取器将Set-Cookie的值提取出来在其余接口中关联该提取信息运行查看关联是否成功 Jmeter-获取接口响应头&#xff08;Response headers&#xff09;信息进行关联 获取某一…...

解密爬虫ip是如何被识别屏蔽的

在当今信息化的时代&#xff0c;网络爬虫已经成为许多企业、学术机构和个人不可或缺的工具。然而&#xff0c;随着网站安全防护的升级&#xff0c;爬虫ip往往容易被识别并屏蔽&#xff0c;给爬虫工作增加了许多困扰。在这里&#xff0c;作为一家专业的爬虫ip供应商&#xff0c;…...

GPIO实验

一、GPIO GPIO&#xff08;General-purpose input/output&#xff09;即通用型输入输出&#xff0c;GPIO可以控制连接在其之上的引脚实现信号的输入和输出 芯片的引脚与外部设备相连&#xff0c;从而实现与外部硬件设备的通讯、控制及信号采集等功能 LED实验步骤 最终目的&am…...

Docker-Compose编排与部署(lnmp实例)

第四阶段 时 间&#xff1a;2023年8月3日 参加人&#xff1a;全班人员 内 容&#xff1a; Docker-Compose编排与部署 目录 一、Docker Compose &#xff08;一&#xff09;概述 &#xff08;二&#xff09;Compose适用于所有环境&#xff1a; &#xff08;三&#xf…...

Docker 网络模型使用详解 (1)Dockers网络基础

目录 环境准备 Dockers 网络基础 1.端口映射 查看随机映射端口范围 -p可以指定映射到本地端口 映射指定地址和指定端口 映射指定地址 宿主机端口随机分配 指定传输协议 端口暴露 容器互联 自定义网络 现在把container7加入到demo_net中 在启动一个容器加入到demo_net…...

【Spring】(四)Bean 的作用域和生命周期

文章目录 前言一、Bean 的作用域1.1 被修改的 Bean 案例1.2 作用域的定义1.3 Bean 的六种作用域1.4 Bean 作用域的设置 二、Spring 的执行流程 和 Bean 的生命周期2.1 Spring 的执行流程2.2 Bean 的生命周期2.3 Bean 生命周期的演示 前言 Bean 是 Spring 框架中的一个核心概念…...

卷积神经网络【图解CNN】

文章目录 1.卷积运算2.池化3.全连接层 卷积神经网络可以看作一个函数或者黑箱&#xff0c;输入就是图片的像素阵列&#xff0c;输出就是这个图片是什么&#xff1f; 图片是X&#xff0c;那么就输出‘x’&#xff0c;图片是‘O’,那么就输出O&#xff1b; 在计算机眼中&#xff…...

命令模式 Command Pattern 《游戏设计模式》学习笔记

对于一般的按键输入&#xff0c;我们通常这么做&#xff0c;直接if按了什么键&#xff0c;就执行相应的操作 在这里我们是将用户的输入和程序行为硬编码在一起&#xff0c;这是我们很自然就想到的最快的做法。 但是如果这是一个大型游戏&#xff0c;往往我们需要实现一个按键…...

供水管网漏损监测,24小时保障城市供水安全

供水管网作为城市生命线重要组成部分&#xff0c;其安全运行是城市建设和人民生活的基本保障。随着我国社会经济的快速发展和城市化进程的加快&#xff0c;城市供水管网的建设规模日益增长。然而&#xff0c;由于管网老化、外力破坏和不当维护等因素导致的供水管网漏损&#xf…...

How to Use Glslang

文章目录 Execution of Standalone Wrapper构建 (CMake)依赖关系构建步骤如果需要更改 GLSL 语法测试运行测试基本内部操作 Execution of Standalone Wrapper 要使用独立的二进制形式&#xff0c;请执行glslang&#xff0c;它将打印一条使用语句。基本操作是给它一个包含着色器…...

AcWing 24:机器人的运动范围 ← BFS、DFS

【题目来源】https://www.acwing.com/problem/content/description/22/【题目描述】 地上有一个 m 行和 n 列的方格&#xff0c;横纵坐标范围分别是 0∼m−1 和 0∼n−1。 一个机器人从坐标 (0,0) 的格子开始移动&#xff0c;每一次只能向左&#xff0c;右&#xff0c;上&#…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...