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

Java实现音频录音播放机功能

Java实现一个简单的音频录音和播放功能,使用Swing创建图形用户界面,利用Java Sound API进行音频处理。下面是对此程序的详细剖析:
一、程序结构
程序主要由以下几个部分组成:

  • RecorderFrm类:主框架类,继承自JFrame,负责UI界面和主要逻辑

  • Recorder内部类:实现Runnable接口,负责录音功能

  • 多个辅助方法:如getAudioFormat(), playMusic(), save(), open()等

二、程序主要功能
2.1 录音功能

  • 使用TargetDataLine从麦克风捕获音频数据
  • 音频数据存储在ByteArrayOutputStream中
  • 录音过程在单独线程中运行,避免阻塞UI

2.2 播放功能
可以选择并播放已保存的WAV文件;使用SourceDataLine进行音频播放。

2.3 文件操作

  • 可以将录音保存为WAV格式文件

  • 可以打开已有的WAV文件进行播放

  1. 关键组件分析
    3.1 音频格式设置
    getAudioFormat()方法定义了音频参数:
    编码:PCM_SIGNED
    采样率:44100Hz
    采样精度:16位
    单声道(声道数:1)
    帧大小:2字节
    帧率:44100
    字节序:小端(Little-endian)

3.2 录音流程
创建TargetDataLine
打开并启动数据线
循环读取音频数据到缓冲区
将数据写入ByteArrayOutputStream
停止时关闭资源

3.3 播放流程
选择音频文件
创建AudioInputStream
获取音频格式
创建并打开SourceDataLine
从输入流读取数据并写入数据线播放

3.4 文件保存
将ByteArrayOutputStream转换为ByteArrayInputStream
创建AudioInputStream
使用AudioSystem.write()方法将音频写入WAV文件

在这里插入图片描述

Java实现音频录音和播放机功能程序的源码:

package Record;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.LinkedList;
import java.util.Queue;
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.TargetDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
public class RecorderFrm  extends JFrame implements ActionListener {//队列queue,放置声道音频数据。录音用一个话筒,单声道。Queue<Short> qAudio = new LinkedList<>();//定义字节数组输出流。 用于保存音频数据。ByteArrayOutputStream bOutStm = null;Boolean stopflag = false; //停止录音的标志,用于控制录音线程的运行//定义所需要的组件JPanel panelA, panelB;JButton recordeBtn, stopBtn, playBtn;//构造函数public RecorderFrm() {//面板组件初始化panelA = new JPanel();panelB = new JPanel();//面板panelB上按钮组件的设置recordeBtn = new JButton("开始录音");recordeBtn.addActionListener(this); //给按钮注册监听recordeBtn.setActionCommand("recorde");stopBtn = new JButton("停止录音");stopBtn.addActionListener(this); //给按钮注册监听stopBtn.setActionCommand("stop");playBtn = new JButton("播放录音");playBtn.addActionListener(this); //给按钮注册监听playBtn.setActionCommand("play");//设置面板panelBpanelB.setLayout(null);panelB.setLayout(new GridLayout(1, 4, 10, 10));panelB.add(recordeBtn);panelB.add(stopBtn);panelB.add(playBtn);//设置按钮的初始属性recordeBtn.setEnabled(true);stopBtn.setEnabled(false);playBtn.setEnabled(false);//在主窗体上布置面板组件add(panelA, BorderLayout.CENTER);add(panelB, BorderLayout.SOUTH);//设置窗口的属性setSize(400, 160);setTitle("音频录音播放机");setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setLocationRelativeTo(null);setVisible(true);}@Overridepublic void actionPerformed(ActionEvent e) {if (e.getActionCommand().equals("recorde")) {//点击录音按钮后的动作recordeBtn.setEnabled(false);stopBtn.setEnabled(true); //启用停止按钮playBtn.setEnabled(false);recorde(); //调用录音的方法} else if (e.getActionCommand().equals("stop")) {//点击停止录音按钮的动作recordeBtn.setEnabled(true);stopBtn.setEnabled(false);playBtn.setEnabled(true); stop(); //调用停止录音的方法} else if (e.getActionCommand().equals("play")) {play(); //调用播放录音的方法}}//开始录音public void recorde() {//创建播放录音的线程Recorder recorder = new Recorder();Thread recorderTrd = new Thread(recorder);recorderTrd.start();}//停止录音。设置“停止”标志,并保存录音public void stop() { stopflag = true; save(); //保存音频文件到磁盘}//播放录音public void play() {File file = open(); //选择音频文件System.out.println("正在播放录音… ");playMusic(file); //打开音频文件播放音乐}//保存录音到磁盘public void save() {File file = null; //文件名FileNameExtensionFilter filter; //后缀名过滤器JFileChooser chooser;//创建文件选择器,指定当前目录为"D:\test"。chooser = new JFileChooser("D:\\test");//文件后缀名过滤器filter = new FileNameExtensionFilter("音频文件(*.wav,*.WAV)","wav","WAV");   chooser.setFileFilter(filter); //设置文件扩展名ByteArrayInputStream bais = null; //定义字节数组输入流AudioInputStream ais = null; //定义音频输入流AudioFormat fmt = getAudioFormat(); //取得录音格式byte audioData[] = bOutStm.toByteArray();bais = new ByteArrayInputStream(audioData);long len = audioData.length / fmt.getFrameSize();ais = new AudioInputStream(bais,fmt,len);//写入文件try {int value=chooser.showDialog(this,"保存文件");                           if (value==JFileChooser.APPROVE_OPTION) { //判断用户是否保存文件/*  使用文件句柄(对象),接收返回值。保存文件通常只需处理单选 ***/file =  chooser.getSelectedFile();String pathStr = file.getAbsolutePath();/***检查path中是否已包含文件扩展名***/boolean flag = false;for (String extension : filter.getExtensions()) {if (pathStr.contains(extension)) {flag=true;break;}}if (!flag) {pathStr += ".wav"; //若不包含扩展名,添加扩展名file = new File(pathStr); //重新创建文件句柄}System.out.println("保存文件的绝对路径: "+pathStr);//保存文件操作AudioSystem.write(ais, AudioFileFormat.Type.WAVE, file);} } catch (Exception e) {e.printStackTrace();} finally {//关闭流try {if (bais != null) bais.close();if (ais != null)  ais.close();} catch (Exception e) {e.printStackTrace();}}}//打开,选择录音文件private File open() {File path = null;//设置文件过滤器FileNameExtensionFilter filter = null;filter = new FileNameExtensionFilter("音频文件(*.wav)","wav");JFileChooser chooser = new JFileChooser("D:\\test");//默认路径chooser.setFileFilter(filter);chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);chooser.setMultiSelectionEnabled(false); //单选文件int result = chooser.showDialog(this, "打开音频文件");if (result==JFileChooser.APPROVE_OPTION) {path = chooser.getSelectedFile();}return path;}public static void main(String[] args) {new RecorderFrm(); //创建实例}private void playMusic(File path){AudioInputStream inStream;AudioFormat format;SourceDataLine sourceDataLine;DataLine.Info info;try{int count;byte buf[] = new byte[1024];//获取音频输入流inStream = AudioSystem.getAudioInputStream(path);//获取音频的编码格式format = inStream.getFormat();info = new DataLine.Info(SourceDataLine.class,format,AudioSystem.NOT_SPECIFIED);sourceDataLine = (SourceDataLine)AudioSystem.getLine(info);sourceDataLine.open(format);sourceDataLine.start();	//播放音频while((count = inStream.read(buf,0,buf.length)) != -1){sourceDataLine.write(buf,0,count);			}//播放结束,释放资源sourceDataLine.drain();sourceDataLine.close();inStream.close();}catch(UnsupportedAudioFileException ex){ex.printStackTrace();}catch(LineUnavailableException ex){ex.printStackTrace();}catch(IOException ex){ex.printStackTrace();}}//设置AudioFormat的参数public AudioFormat getAudioFormat() {//参数Encoding:音频编码格式AudioFormat.Encoding encoding = AudioFormat.Encoding.PCM_SIGNED;/***其它参数说明float sampleRate = 44100f; //采样率int sampleSize = 16; //SampleSizeInBits: 采样精度int channels = 2; //声道数//FrameSize: 帧大小,每帧的字节数。int frameSize=4;//frameSize=(sampleSize/8)*channelsfloat frameRate = 44100f; //FrameRate: 帧频,每秒的帧数。boolean bigEndian = false;* BigEndian: 与传输和存储相关的字节序列标志。* 有两种类型:Big-endian和Little-endian* 值false表示Little-endian;值true表示Big-endian。* ***///AudioFormat(encoding,sampleRate,sampleSizeInBits,channels,frameSize,frameRate,bigEndian)//AudioFormat format = new AudioFormat(encoding, 44100, 16, 2, 4, 44100, false); 立体声AudioFormat format = new AudioFormat(encoding, 44100, 16, 1, 2, 44100, false);//单声道return format;}//录音类,因为要用到主类中的变量,所以将其做成内部类class Recorder implements Runnable {DataLine.Info info = null;AudioFormat format = null;  //定义音频格式//定义目标数据行,可以从中读取音频数据,该 TargetDataLine 接口提供从目标数据行的缓冲区读取所捕获数据的方法。TargetDataLine tdLine = null;//定义存放录音的字节数组,作为缓冲区byte bts[] = new byte[2048];//将字节数组包装到流里,最终存入到bOutStm中@Override //重写run函数public void run() {bOutStm = new ByteArrayOutputStream();try {format = getAudioFormat();info = new DataLine.Info(TargetDataLine.class, format);tdLine = (TargetDataLine) (AudioSystem.getLine(info));//打开具有指定格式的行,这样可使行获得所有所需的系统资源并变得可操作。tdLine.open(format);//允许某一数据行执行数据 I/OtdLine.start();/******/System.out.println("正在录音...");stopflag = false;int size = format.getFrameSize();while (stopflag != true) {//当停止录音按钮未按下时,该线程一直执行//从目标数据行读取音频数据到字节数组bts,cnt 是实际读取的字节数int cnt = tdLine.read(bts, 0, bts.length);if (cnt > 0) {bOutStm.write(bts, 0, cnt);}}System.out.println("录音结束!");} catch (Exception e) {e.printStackTrace();} finally {try { //关闭打开的字节数组流if (bOutStm != null) bOutStm.close();} catch (IOException e) {e.printStackTrace();} finally {tdLine.drain();tdLine.close();}}}}
}

总结 本例程的技术要点:

  • 使用Java Sound API进行底层音频操作

  • 多线程处理录音过程

  • Swing构建用户界面

  • 字节流处理音频数据

  • 文件对话框进行文件操作

这个程序很好地演示了Java中音频录制和播放的基本原理,代码结构清晰,适合作为学习Java音频处理的示例。

相关文章:

Java实现音频录音播放机功能

Java实现一个简单的音频录音和播放功能&#xff0c;使用Swing创建图形用户界面&#xff0c;利用Java Sound API进行音频处理。下面是对此程序的详细剖析&#xff1a; 一、程序结构 程序主要由以下几个部分组成&#xff1a; RecorderFrm类&#xff1a;主框架类&#xff0c;继承自…...

OpenCV 图形API(26)图像滤波-----方框滤波函数boxFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 使用方框滤波器模糊图像。 该函数使用以下内核来平滑图像&#xff1a; K α [ 1 1 … 1 1 1 … 1 ⋮ ⋮ ⋱ ⋮ 1 1 … 1 ] K \alpha \begin{b…...

oracle 表空间(Tablespace)

在 Oracle 11g 中&#xff0c;表空间&#xff08;Tablespace&#xff09; 是数据库存储架构的核心逻辑单元&#xff0c;其原理基于 逻辑存储与物理存储的分离&#xff0c;通过分层管理数据文件、段&#xff08;Segment&#xff09;、区&#xff08;Extent&#xff09;和数据块&…...

Git 高级操作

Git不仅是代码管理的基石工具&#xff0c;更是开发者提升效率的瑞士军刀。掌握基础操作只是起点&#xff0c;真正的高手都在使用进阶技巧优化工作流。本文将深入解析Git四大高阶操作&#xff0c;助你轻松应对复杂开发场景&#xff01; 一、交互式暂存&#xff1a;精准控制提交粒…...

Go:程序结构

文章目录 名称声明变量短变量声明指针new 函数变量的生命周期 赋值多重赋值可赋值性 类型声明包和文件导入包初始化 作用域 名称 命名规则&#xff1a; 通用规则&#xff1a;函数、变量、常量、类型、语句标签和包的名称&#xff0c;开头须是字母&#xff08;Unicode 字符 &a…...

sqlserver2017 分离附加数据库

分离数据库 分离数据库是指将数据库从 SQL Server 实例中移除&#xff0c;但会完整保留数据库及其数据文件和事务日志文件。 然后可以使用这些文件将数据库附加到任何 SQL Server 实例&#xff0c;包括分离该数据库的服务器。 如果存在下列任何情况&#xff0c;则不能分离数据…...

QuarkPi-CA2 RK3588S卡片电脑:6.0Tops NPU+8K视频编解码+接口丰富,高性能嵌入式开发!

QuarkPi-CA2 RK3588S卡片电脑&#xff1a;6.0Tops NPU8K视频编解码接口丰富&#xff0c;高性能嵌入式开发&#xff01; 芯片框架 视频介绍 https://www.bilibili.com/video/BV1btdbYkEjY 开发板介绍 核心升级&#xff0c;产品炸裂 QuarkPi-CA2卡片电脑搭载瑞芯微RK3588S芯片…...

对称加密与非对称加密与消息摘要算法保证https的数据交互的完整性和保密性

一、对称加密与非对称加密的作用 1. 对称加密 作用&#xff1a; 保密性&#xff1a;对称加密使用相同的密钥对数据进行加密和解密&#xff0c;确保数据在传输过程中不被窃听。效率&#xff1a;对称加密算法&#xff08;如AES&#xff09;计算速度快&#xff0c;适合加密大量数…...

Lab Cloud FPGA 硬件在线实验云平台介绍

友晶科技依托其在FPGA技术领域的深厚积累&#xff0c;成功研发出了一套完整的FPGA云平台解决方案&#xff08;即FPGA 硬件在线实验云&#xff0c;简称LabCloud &#xff09;。LabCloud 是一个高效、实用的学习平台&#xff0c;目前已在多个学校成功部署。 LabCloud 是通过 B/S …...

相机回调函数为静态函数原因

在注册相机SDK的回调函数时&#xff0c;是否需要设置为静态函数取决于具体SDK的设计要求&#xff0c;但通常需要遵循以下原则&#xff1a; 1. 必须使用静态函数的情况 当相机SDK是C语言接口或要求普通函数指针时&#xff0c;回调必须声明为静态成员函数或全局函数&#xff1a;…...

实验室纯水器实验室超纯水机(常见类型、选型建议、维护保养)

不同实验室用水级别有何差异&#xff1f; 实验室用水级别由ASTM或ISO 3696等质量标准定义&#xff0c;有助于特定应用选择适合的水质。这些标准也考虑了生产成本&#xff0c;如1级(Type 1)超纯水的生产成本远高于2级(Type 2)或3级(Type 3)纯水。 1级超纯水 不含离子&#xff…...

腾讯云COS与ZKmall 开源商城的存储集成方案

ZKmall 开源商城与腾讯云对象存储&#xff08;COS&#xff09;的集成&#xff0c;可通过云端资源托管、自动化数据同步、高性能存储架构实现本地存储负载降低与访问效率提升。以下是基于搜索结果的集成路径与核心优化点&#xff1a; 一、存储架构升级&#xff1a;本地与云端协同…...

Python 深度学习实战 第3章 Keras和TensorFlowKeras 训练和评估模型实例

Python 深度学习实战 第3章 Keras和TensorFlow&Keras 训练和评估模型实例 内容概要 第3章介绍了Keras和TensorFlow的基本概念及其关系&#xff0c;并指导如何设置深度学习工作区。本章还概述了核心深度学习概念如何转化为Keras和TensorFlow API。通过本章&#xff0c;读者…...

基于SpringBoot的动物救助中心系统(源码+数据库)

500基于SpringBoot的动物救助中心系统&#xff0c;本系统共分为2个角色&#xff1a;系统管理员、用户&#xff0c;主要功能如下 【管理员】&#xff1a; 1. 登录&#xff1a;管理员可以通过登录系统来管理各种功能。 2. 用户管理&#xff1a;管理员可以查看用户列表&#xff0…...

【多模态大模型】《Qwen2.5-Omni》 论文解读

《Qwen2.5-Omni&#xff1a;重新定义端到端全模态大模型的技术范式》 论文解读 论文&#xff1a; https://arxiv.org/abs/2503.20215 &#xff08;2025.03.26&#xff09;代码&#xff1a; https://github.com/QwenLM/Qwen2.5-OmniNews&#xff1a; https://mp.weixin.qq.com/…...

go 通过汇编分析函数传参与返回值机制

文章目录 概要一、前置知识二、汇编分析2.1、示例2.2、汇编2.2.1、 寄存器传值的汇编2.2.2、 栈内存传值的汇编 三、拓展3.1 了解go中的Duff’s Device3.2 go tool compile3.2 call 0x46dc70 & call 0x46dfda 概要 在上一篇文章中&#xff0c;我们研究了go函数调用时的栈布…...

蓝桥杯C/C++省赛/国赛注意事项及运行环境配置

大佬的蓝桥杯考前急救指南 对拍&#xff08;手动生成测试数据&#xff09;代码&#xff1a; #include <bits/stdc.h> // 包含所有标准库的头文件 using namespace std; // 使用标准命名空间int main() {srand(time(0)); // 设置随机数种子为当前时间&#xff0c;确保每次…...

CSS高度坍塌?如何解决?

一、什么是高度坍塌&#xff1f; 高度坍塌&#xff08;Collapsing Margins&#xff09;是指当父元素没有设置边框&#xff08;border&#xff09;、内边距&#xff08;padding&#xff09;、内容&#xff08;content&#xff09;或清除浮动时&#xff0c;其子元素的 margin 会…...

redis的基本使用

简介 redis&#xff0c;Remote Dictionary Server&#xff0c;远程字典服务&#xff0c;一个基于内存的、存储键值对的数据库。redis是开源的&#xff0c;使用C语言编写。因为redis的数据是存储在内存中的&#xff0c;所以redis通常被用来做数据库的缓存 优点&#xff1a; re…...

【蓝桥杯】单片机设计与开发,第十二届

/*头文件声明区*/ #include <STC15F2K60S2.H>//单片机寄存器头文件 #include <init.h>//初始化底层驱动头文件 #include <led.h>//led,蜂鸣器,继电器底层驱动头文件 #include <key.h>//按键底层驱动头文件 #include <seg.h>//数码管底层驱动头…...

主流时序数据库深度对比:TDengine、InfluxDB与IoTDB的技术特性、性能及选型考量

目录 引言 一、 核心架构与技术特性对比 1.1、 TDengine&#xff1a;面向物联网的特定优化 1.2. InfluxDB&#xff1a;成熟的通用时序平台 1.3. Apache IoTDB&#xff1a;面向工业场景的精细化设计 二、 核心性能指标对比分析 2.1、写入性能 2.2、查询性能 三、 关键技…...

使用人工智能大模型腾讯元宝,如何免费快速做高质量的新闻稿?

今天我们学习使用人工智能大模型腾讯元宝&#xff0c;如何免费快速做高质量的新闻稿&#xff1f; 手把手学习视频地址&#xff1a;https://edu.csdn.net/learn/40402/666431 第一步在腾讯元宝对话框中输入如何协助老师做新闻稿&#xff0c;通过提问&#xff0c;我们了解了老师…...

国产Linux系统统信安装redis教程步骤

系统环境 uname -a Linux FlencherHU-PC 6.12.9-amd64-desktop-rolling #23.01.01.18 SMP PREEMPT_DYNAMIC Fri Jan 10 18:29:31 CST 2025 x86_64 GNU/Linux官网下载源码包并解压 下载链接 https://download.redis.io/releases/redis-7.0.15.tar.gz?_gl11h424d3_gcl_au*ODQ5…...

leetcode590 N叉树的后序遍历

前序遍历 的顺序是&#xff1a;根 → 子节点1 → 子节点2 → ... → 子节点N 后序遍历 的顺序是&#xff1a;子节点1 → 子节点2 → ... → 子节点N → 根 首先一个办法就是前序遍历结果进行翻转 在 迭代法 实现 后序遍历 时&#xff0c;如果采用 前序遍历 反转 的方式&…...

docker desktop 的安装和使用

一、Docker Desktop 是什么&#xff1f; Docker Desktop 是一款专为开发者设计的工具&#xff0c;可以在本地计算机&#xff08;Windows/macOS&#xff09;上快速运行和管理容器&#xff08;Container&#xff09;环境。以下是核心功能&#xff1a; 核心特点说明容器化开发基于…...

QCustomPlot频谱图

使用QCutomPlot做的读取txt文件显示频谱图的demo,帮助大家了解QCustomPlot的基本使用 1.运行结果 demo比较简单,用于文件读取,鼠标放大缩小,右键截图等基础功能. 2.绘图详解 绘图核心是将类提升为QCustomPlot之后进行重绘,重绘之前设计图表曲线,图标标题,坐标轴,坐标轴范围,背…...

Python 和 JavaScript两种语言的相似部分-由DeepSeek产生

Python 和 JavaScript 作为两种流行的编程语言&#xff0c;虽然在设计目标和应用场景上有差异&#xff08;Python 偏向后端和脚本&#xff0c;JavaScript 偏向前端和动态交互&#xff09;&#xff0c;但它们的语法存在许多相似之处。以下是两者在语法上的主要共同点及对比&…...

记一次 .NET某云HIS系统 CPU爆高分析

一&#xff1a;背景 1. 讲故事 年前有位朋友找到我&#xff0c;说他们的系统会偶发性的CPU爆高&#xff0c;有时候是爆高几十秒&#xff0c;有时候高达一分多钟&#xff0c;自己有一点分析基础&#xff0c;但还是没找到原因&#xff0c;让我帮忙看下怎么回事&#xff1f; 二&…...

ESP32开发入门:基于VSCode+PlatformIO环境搭建指南

前言 ESP32作为一款功能强大的物联网开发芯片&#xff0c;结合PlatformIO这一现代化嵌入式开发平台&#xff0c;可以大幅提升开发效率。本文将详细介绍如何在VSCode中搭建ESP32开发环境&#xff0c;并分享实用开发技巧。 一、环境安装&#xff08;Windows/macOS/Linux&#xf…...

在 macOS 上设置来电自启动

在 macOS 中&#xff0c;系统本身并不支持直接通过“接上电源适配器”自动开机&#xff08;此功能涉及硬件底层控制&#xff09;。但针对 Intel 处理器的 Mac 机型&#xff0c;可以通过以下方法间接实现类似效果。对于 Apple Silicon&#xff08;M1/M2/M3&#xff09;芯片的 Ma…...

【技术】Ruby 生态概念速查表,通过对比nodejs生态(入门)

以下是 Ruby 生态 对应概念的速查表&#xff0c;并使用与 Node.js 生态 对比的方式来参照&#xff0c;涵盖名称、作用&#xff08;或解释&#xff09;、简单用法、可能的替代方案&#xff0c;以及 Node.js 中最相似或可类比的工具&#xff08;如果有的话&#xff09;。有些工具…...

入门级宏基因组数据分析教程,从实验到分析与应用

宏基因组学彻底改变了研究人员对微生物群落的认识&#xff0c;微生物组不仅是环境组分&#xff0c;更作为共生体深刻影响着宿主的健康与功能。 鉴于微生物群落固有的复杂性及其所处环境的多样性&#xff0c;研究者进行一些宏基因组学研究时必须精心设计以获取能真实反映目标群体…...

解决 Vue 中 input 输入框被赋值后,无法再修改和编辑的问题

目录 需求&#xff1a; 出现 BUG&#xff1a; Bug 代码复现 解决问题&#xff1a; 解决方法1&#xff1a; 解决方法2 关于 $set() 的补充&#xff1a; 需求&#xff1a; 前段时间&#xff0c;接到了一个需求&#xff1a;在选择框中选中某个下拉菜单时&#xff0c;对应的…...

聚划算!CNN-GRU、CNN、GRU三模型多变量回归预测

聚划算&#xff01;CNN-GRU、CNN、GRU三模型多变量回归预测 目录 聚划算&#xff01;CNN-GRU、CNN、GRU三模型多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 聚划算&#xff01;CNN-GRU、CNN、GRU三模型多变量回归预测 (Matlab2023b 多输入单输出) 1.程…...

list的常见接口使用

今天&#xff0c;我们来讲解一下C关于STL标准库中的一个容器list的常见接口。 在我们之前c语言数据结构中&#xff0c;我们已经了解过了关于链表的知识点了&#xff0c;那么对于现在理解它也是相对来说比较容易的了。 数据结构--双向循环链表-CSDN博客 1. 定义与包含头文件 …...

5. 蓝桥公园

题目描述 小明喜欢观景&#xff0c;于是今天他来到了蓝桥公园。 已知公园有 N 个景点&#xff0c;景点和景点之间一共有 M 条道路。小明有 Q 个观景计划&#xff0c;每个计划包含一个起点 stst 和一个终点 eded&#xff0c;表示他想从 stst 去到 eded。但是小明的体力有限&am…...

零基础开始学习鸿蒙开发-智能家居APP离线版介绍

目录 1.我的小屋 2.查找设备 3.个人主页 前言 好久不发博文了&#xff0c;最近都忙于面试&#xff0c;忙于找工作&#xff0c;这段时间终于找到工作了。我对鸿蒙开发的激情依然没有减退&#xff0c;前几天做了一个鸿蒙的APP&#xff0c;现在给大家分享一下&#xff01; 具体…...

你的 Linux 服务器连不上网?10 分钟入门网络故障排查

问题现象&#xff1a;服务器突然失去网络连接 当你兴冲冲地打开终端&#xff0c;准备开始一天的开发工作时&#xff0c;却发现服务器无法连接网络&#xff0c;ifconfig命令只能看到本地环回接口(lo)。这种突如其来的网络中断可能会让很多Linux新手感到手足无措。 别担心&…...

《Vue Router实战教程》20.路由懒加载

欢迎观看《Vue Router 实战&#xff08;第4版&#xff09;》视频课程 路由懒加载 当打包构建应用时&#xff0c;JavaScript 包会变得非常大&#xff0c;影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块&#xff0c;然后当路由被访问的时候才加载对应组件&am…...

JVM 之 String 引用机制解析:常量池、堆内存与 intern 方法

案例一&#xff1a; String s1 new String("1"); String s2 "1"; System.out.println(s1 s2);s1: 执行 new String("1")&#xff0c;JVM 首先在字符串常量池中查找或添加字面量 "1"&#xff0c;然后在堆内存中新建一个内容为 &quo…...

如何在 Mac 上安装 Python

所有最新的 MacOS&#xff08;从 macOS 12.3 开始&#xff09;都预装了 Python 版本&#xff08;通常是 Python 2.x&#xff09;&#xff0c;但它已经过时并且不再受支持。要充分利用 Python 的功能&#xff0c;您需要安装最新版本的 Python。 本文提供了分步教程&#xff0c;展…...

无锡东亭无人机培训机构电话

无锡东亭无人机培训机构电话&#xff0c;随着科技的迅猛发展&#xff0c;无人机逐渐走入我们的生活和工作领域&#xff0c;成为多种行业中不可或缺的工具。而在其广泛的应用中&#xff0c;如何正确、熟练地操控无人机成为了关键。因此&#xff0c;找到一家专业的无人机培训机构…...

WPS复制粘贴错误 ,文件未找到 mathpage.wll

文章目录 1.错误提示图片2.解决方案1.找到MathType.wll文件和MathType Commands 2016.dotm文件并复制2.找到wps安装地址并拷贝上述两个文件到指定目录 3.重启WPS 1.错误提示图片 2.解决方案 1.找到MathType.wll文件和MathType Commands 2016.dotm文件并复制 MathType.wll地址如…...

蓝桥杯单片机刷题——按键设置当前采集距离为距离参数

设计要求 驱动超声波传感器&#xff0c;启动距离测量功能,并将其结果显示到数码管上。 按键“S5”定义为参数按键&#xff0c;按下S5按键&#xff0c;设备自动将当前采集的距离数据作为距离参数&#xff1b; 若测量的距离数据超过距离参数&#xff0c;指示灯L1点亮&#xff…...

mybaties plus 更新null值进入数据库

&#xff08;数据库一定要支持字段为null值&#xff09; 问题&#xff1a; 假设我现在数据库里有一个值是1&#xff0c;这个字段允许为null。 目前我使用的是的mybaties plus&#xff0c;我希望将这个值更新weinull&#xff0c;如何操作&#xff1f; 提示&#xff1a;如果直接…...

VSCode优雅的使用debug

原始用法&#xff1a;(这里不使用) 配置launch.json&#xff0c;里面传入参数然后debug&#xff0c;这里我们通常需要传入的参数比较多&#xff0c;而且经常修改参数&#xff0c;直接去修改launch.json会比较麻烦&#xff0c;所以使用sh脚本比较方便。 {// Use IntelliSense to…...

优化你的 REST Assured 测试:设置默认主机与端口、GET 请求与断言

REST Assured 是一个功能强大的 Java 库&#xff0c;用于测试 RESTful Web 服务。它简化了 API 测试流程&#xff0c;提供了一整套用于高效验证响应的工具。在本篇博客中&#xff0c;我们将深入探讨几个核心概念&#xff0c;包括如何设置默认主机和端口、如何发起 GET 请求以及…...

JVM之String创建、拼接

一、字符串创建的两种方式 1. 字面量直接赋值 String s1 "a"; 过程&#xff1a; JVM 检查字符串常量池中是否存在 "a"。若存在&#xff0c;直接返回常量池中的引用。若不存在&#xff0c;在常量池中创建 "a"&#xff0c;返回其引用。 特点&a…...

UE5 模仿生存建造类游戏创建的过程

一、大概流程如下 点击界面按钮生成Actor->移动鼠标Actor的位置随着鼠标移动移动->点击鼠标左键确定Actor的位置 使用了盒体检测GetWorld()->SweepSingleByChannel()函数检测是否发生碰撞通过 FCollisionQueryParams CollisionParams;CollisionParams.AddIgnoredAc…...

大模型在慢性髓细胞白血病(CML)初治成人患者诊疗中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 国内外研究现状 1.3 研究目的与内容 二、大模型技术与 CML 相关知识 2.1 大模型技术原理与特点 2.2 CML 的病理生理与诊疗现状 三、术前风险预测与手术方案制定 3.1 术前数据收集与预处理 3.2 大模型预测术前风险 3.3 根据预测…...