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

【JavaSE】Java基础语法(四十二):NIO

文章目录

  • 1. 概述
  • 2. NIO与BIO的区别
  • 3. NIO三大模块
  • 4. NIO创建缓冲区对象【应用】
  • 5. NIO缓冲区添加数据【应用】
  • 6. NIO缓冲区获取数据【应用】
  • 7. 小结


在这里插入图片描述

1. 概述

  • BIO
    Blocking IO,阻塞型IO
  • NIO
    No Blocking IO,非阻塞型IO
  • 阻塞IO的弊端
    在等待的过程中,什么事也做不了
  • 非阻塞IO的好处
    不需要一直等待,当一切就绪了再去做

2. NIO与BIO的区别

  • 区别一
    BIO是阻塞的,NIO是非阻塞的
  • 区别二
    BIO是面向流的,NIO是面向缓冲区的
    BIO中数据传输是单向的,NIO中的缓冲区是双向的

3. NIO三大模块

  • 缓冲区
    用来存储数据
  • 通道
    用来建立连接和传输数据
  • 选择器
    监视通道状态

在这里插入图片描述


4. NIO创建缓冲区对象【应用】

  • 方法介绍
    在这里插入图片描述

  • 代码示例

    public class CreateByteBufferDemo1 {public static void main(String[] args) {//method1();//method2();ByteBuffer wrap = ByteBuffer.wrap("aaa".getBytes());for (int i = 0; i < 3; i++) {System.out.println(wrap.get());}}private static void method2() {byte [] bytes = {97,98,99};ByteBuffer byteBuffer2 = ByteBuffer.wrap(bytes);//缓冲区的长度3//缓冲区里面的内容就是字节数组的内容.for (int i = 0; i < 3; i++) {System.out.println(byteBuffer2.get());}System.out.println(byteBuffer2.get());}private static void method1() {ByteBuffer byteBuffer1 = ByteBuffer.allocate(5);//getfor (int i = 0; i < 5; i++) {System.out.println(byteBuffer1.get());}System.out.println(byteBuffer1.get());}
    }
    

5. NIO缓冲区添加数据【应用】

  • 方法介绍
    在这里插入图片描述

  • 代码示例

    public class ByteBufferDemo2 {public static void main(String[] args) {// int position() 当前要操作的索引// int limit() 最多能操作到哪个索引// int capacity() 缓冲区的总长度ByteBuffer byteBuffer = ByteBuffer.allocate(10);System.out.println(byteBuffer.position());//0System.out.println(byteBuffer.limit());//10System.out.println(byteBuffer.capacity());//10// put(byte b) 一次添加一个字节// byteBuffer.put((byte) 97);// System.out.println(byteBuffer.position());// System.out.println(byteBuffer.limit());// System.out.println(byteBuffer.capacity());// put(byte[] src) 一次添加一个字节数组// byteBuffer.put("aaa".getBytes());// System.out.println(byteBuffer.position());//3// System.out.println(byteBuffer.limit());//10// System.out.println(byteBuffer.capacity());//10// position(int newPosition) 修改position// byteBuffer.position(1);// limit(int newLimit) 修改limit// byteBuffer.limit(5);// System.out.println(byteBuffer.position());// System.out.println(byteBuffer.limit());// System.out.println(byteBuffer.capacity());// int remaining() 还有多少能操作// boolean hasRemaining() 是否还有能操作的byteBuffer.put("0123456789".getBytes());System.out.println(byteBuffer.remaining());System.out.println(byteBuffer.hasRemaining());}
    }
    

6. NIO缓冲区获取数据【应用】

  • 方法介绍
    在这里插入图片描述

  • 代码示例

public class ByteBufferDemo3 {public static void main(String[] args) {ByteBuffer byteBuffer = ByteBuffer.allocate(10);byteBuffer.put("abc".getBytes());// flip() 切换读写模式(写读)byteBuffer.flip();// get() 读一个字节// while(byteBuffer.limit() != byteBuffer.position()){// System.out.println((char) byteBuffer.get());// }for (int i = 0; i < byteBuffer.limit(); i++) {System.out.println((char) byteBuffer.get());}// get(byte[] dst) 读多个字节// byte [] bytes = new byte[byteBuffer.limit()];// byteBuffer.get(bytes);// System.out.println(new String(bytes));// get(int index) 读指定索引的字节// System.out.println((char) byteBuffer.get(0));// rewind() 将position设置为0,可以重复读// byteBuffer.rewind();// for (int i = 0; i < byteBuffer.limit(); i++) {// System.out.println((char) byteBuffer.get());// }// clear() 数据读写完毕(读->写)byteBuffer.clear();byteBuffer.put("qqq".getBytes());// array() 将缓冲区转换成字节数组返回byte[] bytes = byteBuffer.array();System.out.println(new String(bytes));}
}

7. 小结

1. 需求:我要把数据写到缓冲区中。
数据是从外面进入到缓冲区的,所以缓冲区在做读数据的操作。

2. 需求:我要把数据从缓冲区中读出来。
数据是从缓冲区里面到外面的。所以缓冲区在做写数据的操作。

3. capacity:容量(长度)
limit: 界限(最多能读/写到哪里)
posotion:位置(读/写哪个索引)

  1. 获取缓冲区里面数据之前,需要调用flip方法

  2. 再次写数据之前,需要调用clear方法,
    但是数据还未消失,等再次写入数据,被覆盖了才会消失。


在这里插入图片描述

相关文章:

【JavaSE】Java基础语法(四十二):NIO

文章目录 1. 概述2. NIO与BIO的区别3. NIO三大模块4. NIO创建缓冲区对象【应用】5. NIO缓冲区添加数据【应用】6. NIO缓冲区获取数据【应用】7. 小结 1. 概述 BIO Blocking IO,阻塞型IONIO No Blocking IO,非阻塞型IO阻塞IO的弊端 在等待的过程中,什么事也做不了非阻塞IO的好处…...

Linux---systemctl

1. systemctl命令 Linux系统很多软件&#xff08;内置或第三方&#xff09;均支持使用systemctl命令控制&#xff1a;启动、停止、开机自启。 能够被systemctl管理的软件&#xff0c;一般也称之为&#xff1a;服务 语法&#xff1a;systemctl start | stop | status | enabl…...

零钱兑换,凑零钱问题,从暴力递归到动态规划(java)

凑零钱问题&#xff0c;从暴力递归到动态规划 leetcode 322 题 零钱兑换暴力递归&#xff08;这个会超时&#xff0c;leetcode 跑不过去&#xff09;递归缓存动态规划优化暴力递归动态规划专题 leetcode 322 题 零钱兑换 322 零钱兑换 - 可以打开链接测试 给你一个整数数组 c…...

Vue登录界面精美模板分享

文章目录 &#x1f412;个人主页&#x1f3c5;Vue项目常用组件模板仓库&#x1f4d6;前言&#xff1a;&#x1f380;源码如下&#xff1a; &#x1f412;个人主页 &#x1f3c5;Vue项目常用组件模板仓库 &#x1f4d6;前言&#xff1a; 本篇博客主要提供vue组件之登陆组件源码…...

Linux设备驱动程序(二)——建立和运行模块

文章目录 前言一、设置测试系统二、Hello World 模块1、代码详解2、执行效果 三、内核模块相比于应用程序1、用户空间和内核空间2、内核的并发3、当前进程4、几个别的细节 四、编译和加载1、编译模块2、加载和卸载模块3、版本依赖 五、内核符号表六、预备知识七、初始化和关停1…...

【算法】单调栈问题

文章目录 题目思路分析代码实现 题目 给定一个不含有重复值的数组arr&#xff0c;找到每一个i位置左边和右边离i位置最近且值比arr[i]小的位置&#xff0c;返回所有位置相应的消息。 比如arr{3&#xff0c;4&#xff0c;1&#xff0c;5&#xff0c;6&#xff0c;2&#xff0c;…...

Hack The Box - 关卡Dancing

SMB(全称是Server Message Block)是一个协议名&#xff0c;可用于在计算机间共享文件、打印机、串口等&#xff0c;电脑上的网上邻居就是靠它实现的。 SMB 是一种客户机/服务器、请求/响应协议。通过 SMB 协议&#xff0c;客户端应用程序可以在各种网络环境下读、写服务器上的…...

【软件设计与体系结构】 软件体系结构风格

软件体系结构&#xff08;Software Architecture&#xff09; 软件体系结构&#xff08;Software Architecture&#xff09;包括构成系统的设计元素的描述、 设计元素 之间的交互、 设计元素的组合模式以及在这些模式中的约束。 定义 软件体系结构表示系统的框架结构&#xf…...

detectron2 使用教程

本范例演示使用非常有名的目标检测框架detectron2 🤗🤗 在自己的数据集(balloon数据)上训练实例分割模型MaskRCNN的方法。 detectron2框架的设计有以下一些优点: 1,强大:提供了包括目标检测、实例分割、全景分割等非常广泛的视觉任务模型库。 2,灵活:可以通过注册机…...

哈希表常用数据结构

哈希表常用数据结构 查询一个元素是否出现过&#xff0c;或者一个元素是否在集合里的时候&#xff0c;就要第一时间想到哈希法。 哈希法也是空间换时间&#xff0c;因为我们要使用额外的数组&#xff0c;set或者是map来存放数据&#xff0c;才能实现快速的查找。 集合底层实现…...

Java字节流

4 字节流 字节流抽象基类 InputStream:这个抽象类是表示字节输入流的所有类的超类OutputStream:这个抽象类是表示字节输出流的所有类的超类子类名特点:子类名称都是以其父类名作为子类名的后缀4.1 IO流概述和分类 IO流概述: IO: 输入/输出(Input/Output)流:是一种抽象概念…...

arm3399主板-使用ubuntu20.04搭建LVS-DR(netplan)

目录 一、规划 1、网络拓扑 2、检查 二、配置设备 1、配置LVS 1.配置IP转发 2.清除防火墙 3.安装ipvsadm工具 4.配置VIP 5.netplan与NetworkManager介绍 6.添加LVS规则 1.清除防火墙 2.添加伪装IP 3.安装web服务 4. 修改内核参数&#xff0c;防止IP冲突 3、配置w…...

Go中同/异步与锁的应用~~sync包

Go中锁的实现~~sync包 go中sync包中提供了互斥锁; 在前面Go中channel文章中我们使用了time.Sleep()函数使得main函数的Goroutine阻塞至所有协程Goroutine结束,但这并不是一个很好的办法,因为我们实际应用中并不能准确知道协程什么时候结束(这里面要考虑服务器的性能,网络波动以…...

Flask知识点2

1、flash() get_flashed_messages() : 用来消耗flash方法中存储的消息 使用flash存储消息时&#xff0c;需要设置SECRET_KEY flash 内部消息存储依赖了session 2、CSRF(Cross Site Request Forgery) 跨站请求伪造&#xff0c;指攻击者盗用你的身份发送恶意请求 CSRFProt…...

R语言生物群落(生态)数据统计分析与绘图(从数据整理到分析结果展示)

R 语言作的开源、自由、免费等特点使其广泛应用于生物群落数据统计分析。生物群落数据多样而复杂&#xff0c;涉及众多统计分析方法。以生物群落数据分析中的最常用的统计方法回归和混合效应模型、多元统计分析技术及结构方程等数量分析方法为主线&#xff0c;通过多个来自经典…...

代码随想录训练营Day58| 739. 每日温度 496.下一个更大元素 I

目录 学习目标 学习内容 739. 每日温度 496.下一个更大元素 I 学习目标 739. 每日温度 496.下一个更大元素 I 学习内容 739. 每日温度 739. 每日温度 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/daily-temperatures/ class Solution:def da…...

设计模式-命令模式

命令模式 问题背景命令模式基本介绍UML类图 解决方案UML类图代码示例 问题背景 1&#xff09;随着现在科技越来越先进&#xff0c;我们在家庭中对物品的开关都不需要亲自走过去来进行了。我们只需要通过手机APP中的按键来远程执行这个命令。 2&#xff09;其实这就是命令模式&…...

软考——下午题部分,例题一,二,三,六

例题一 11年上半年 病人&#xff0c;护理人员&#xff0c;医生 D 生命体征范围文件 日志文件 病历文件 治疗意见文件 14年上 E1 巴士司机,2 机械师,3 会计,4 主管,5 库存管理系统 D 巴士列表文件 维修记录文件 部件清单 人事档案 14年下 1 客户 2 供应商 D 销售订单表 库存…...

关于render: h => h(App)的解释

当我们第一次安装完脚手架&#xff0c;打开 的时候&#xff0c;我相信&#xff0c;一定有小伙伴和我一样&#xff0c;看到main.js里面的render: h > h(App),感觉懵懵的。 因为&#xff0c;在刚开始接触vue的时候&#xff0c;我们这里是这样写的&#xff1a; 而使用了脚手…...

flask实现简易图书管理系统

项目结构 技术选型 flask 做后端, 提供数据和渲染html 暂时没有提供mysql, 后续会更新操作mysql和样式美化的版本 起一个flask服务 flask是python的一个web框架, 下面演示如何提供http接口, 并返回json数据 main.py # flask创建http接口 from flask import Flask, request, jso…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...