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

Java入坑之Robot类

一、概述

1.1Robot类概述

在Java中,Robot是一个属于java.awt包的类。它还扩展了 Object 类。该类用于为测试自动化、自运行演示以及需要控制鼠标和键盘的其他应用程序生成本机系统输入事件。换句话说,我们使用 Java Robot 类来触发输入事件,例如鼠标单击、按键等。

可以用于测试自动化、自运行演示或其他需要控制鼠标和键盘的应用程序

1.2常用方法

方法名称描述

createScreenCapture(Rectangle screenRect)

创建屏幕捕获(矩形屏幕矩形)

该方法以矩形从屏幕捕获图像

delay(int ms)

延迟(整数毫秒)

它用于睡眠指定的时间。
getAutoDelay()它返回此机器人在生成事件后休眠的毫秒数。
getPixelColor(int x, int y)它返回指定坐标的像素的颜色
isAutoWaitForIdle()该方法返回此机器人在生成事件后是否自动调用 waitForIdle()。

keyPress(int keycode)

按键(整数键代码)

该方法特定键。
keyRelease(int keycode)释放指定的密钥。
mouseMove(int x, int y)它将鼠标指针移到指定的坐标上。

keyPress(int keycode)

鼠标按下(整数按钮)

按下鼠标按钮。

mouseRelease(int buttons)

鼠标释放(整数按钮)

该方法释放鼠标按钮。
mouseWheel(int wheelAmt)它会滚动鼠标滚轮。

mouseRelease(int buttons)

设置自动延迟(整数毫秒)

它设置此机器人在生成事件后休眠的毫秒数。
setAutoWaitForIdle(boolean isOn)它设置此机器人在生成事件后是否自动调用 waitForIdle() 方法。
toString()它返回机器人的字符串表示形式。
waitForIdle()它会等待,直到当前事件队列上的所有事件都已处理完毕。

1.3代码演示

这段代码的主要作用是打开记事本应用程序,然后使用Robot类模拟键盘输入一系列字符,每个字符之间暂停500毫秒。这个示例可以用于演示如何使用Java程序来控制键盘输入

package org.example;import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.io.*;public class KeyBoardControlExample {public static void main(String args[]) throws IOException, AWTException, InterruptedException {// 定义要执行的命令,这里是打开记事本String command = "notepad.exe";Runtime run = Runtime.getRuntime();// 执行操作系统命令,启动记事本应用程序run.exec(command);try {// 延迟等待4秒(4000毫秒),以确保记事本程序完全启动Thread.sleep(4000);} catch (InterruptedException e) {// 处理中断异常e.printStackTrace();}// 创建Robot类的实例,用于模拟键盘输入Robot robot = new Robot();// 模拟按下键盘上的各个键,每个键按下后等待500毫秒robot.keyPress(KeyEvent.VK_W); // 按下 'W'Thread.sleep(500);robot.keyPress(KeyEvent.VK_E); // 按下 'E'Thread.sleep(500);robot.keyPress(KeyEvent.VK_L); // 按下 'L'Thread.sleep(500);robot.keyPress(KeyEvent.VK_C); // 按下 'C'Thread.sleep(500);robot.keyPress(KeyEvent.VK_O); // 按下 'O'Thread.sleep(500);robot.keyPress(KeyEvent.VK_M); // 按下 'M'Thread.sleep(500);robot.keyPress(KeyEvent.VK_E); // 按下 'E'Thread.sleep(500);robot.keyPress(KeyEvent.VK_SPACE); // 按下空格键Thread.sleep(500);robot.keyPress(KeyEvent.VK_T); // 按下 'T'Thread.sleep(500);robot.keyPress(KeyEvent.VK_O); // 按下 'O'Thread.sleep(500);robot.keyPress(KeyEvent.VK_SPACE); // 按下空格键Thread.sleep(500);robot.keyPress(KeyEvent.VK_J); // 按下 'J'Thread.sleep(500);robot.keyPress(KeyEvent.VK_A); // 按下 'A'Thread.sleep(500);robot.keyPress(KeyEvent.VK_V); // 按下 'V'Thread.sleep(500);robot.keyPress(KeyEvent.VK_A); // 按下 'A'Thread.sleep(500);robot.keyPress(KeyEvent.VK_T); // 按下 'T'Thread.sleep(500);robot.keyPress(KeyEvent.VK_P); // 按下 'P'Thread.sleep(500);robot.keyPress(KeyEvent.VK_O); // 按下 'O'Thread.sleep(500);robot.keyPress(KeyEvent.VK_I); // 按下 'I'Thread.sleep(500);robot.keyPress(KeyEvent.VK_N); // 按下 'N'Thread.sleep(500);robot.keyPress(KeyEvent.VK_T); // 按下 'T'Thread.sleep(500);}
}

 代码优化

package org.example;import java.awt.*;
import java.awt.event.KeyEvent;class Robo {// 自定义休眠方法public static void sleep(long ms) {try {Thread.sleep(ms);} catch (Exception ignored) {}}public static void main(String[] args) throws Exception {// 打开记事本应用程序Runtime.getRuntime().exec("notepad.exe");// 等待2秒sleep(2000);// 创建Robot类的实例Robot robot = new Robot();// 要输入的字符串String str = "Hello from GeeksforGeeks";// 使用Robot模拟按键操作// 每次按键之间间隔200毫秒for (int i = 0; i < str.length(); i++) {// 检查当前字符是否是大写字母if (Character.isUpperCase(str.charAt(i))) {// 按下Shift键robot.keyPress(KeyEvent.VK_SHIFT);// 按下当前字符的大写形式robot.keyPress(Character.toUpperCase(str.charAt(i)));// 释放Shift键robot.keyRelease(KeyEvent.VK_SHIFT);}// 否则按下字符本身elserobot.keyPress(Character.toUpperCase(str.charAt(i)));// 等待200毫秒sleep(200);}}
}

1.4应用场景

  • 测试自动化:Robot类可以模拟用户的鼠标和键盘操作,对软件或网页进行自动化的测试,检查其功能和性能是否正常。例如,Robot类可以用来测试Java Swing组件的交互效果¹。
  • 自运行演示:Robot类可以用来制作一些自动运行的演示程序,展示软件或网页的功能和特点。例如,Robot类可以用来制作一个自动在画板上画图的演示程序²。
  • 游戏辅助:Robot类可以用来开发一些游戏辅助工具,通过分析屏幕上的像素颜色和位置,控制鼠标和键盘进行游戏操作。例如,Robot类可以用来实现一个“别踩白块”游戏的辅助程序³。

二、键盘事件

Java中的Robot类可以用于模拟各种键盘事件,包括按下键、释放键和键盘字符事件。以下是一些常见的键盘事件以及如何使用Robot类模拟它们:

2.1按下键: 

要模拟按下键盘上的某个键,您可以使用keyPress方法,并传递一个表示键的常量,例如KeyEvent.VK_KEY,其中"KEY"是要模拟的键的名称。例如,模拟按下"A"键:

import java.awt.*;
import java.awt.event.KeyEvent;public class KeyPressExample {public static void main(String[] args) throws AWTException {Robot robot = new Robot();robot.keyPress(KeyEvent.VK_A); // 按下"A"键}
}

2.2释放键:

要模拟释放键盘上的某个键,您可以使用keyRelease方法,也需要传递表示键的常量。例如,模拟释放"A"键:

import java.awt.*;
import java.awt.event.KeyEvent;public class KeyReleaseExample {public static void main(String[] args) throws AWTException {Robot robot = new Robot();robot.keyRelease(KeyEvent.VK_A); // 释放"A"键}
}

2.3键盘字符事件:

若要模拟键盘字符事件,例如输入文本,您可以使用keyPress和keyRelease方法结合使用,但不需要传递常量。相反,您需要传递字符的ASCII值。例如,模拟键盘输入字符"A":

import java.awt.*;
import java.awt.event.KeyEvent;public class KeyTypedExample {public static void main(String[] args) throws AWTException {Robot robot = new Robot();robot.keyPress(KeyEvent.VK_SHIFT); // 按下Shift键robot.keyPress(KeyEvent.VK_A); // 按下"A"键robot.keyRelease(KeyEvent.VK_A); // 释放"A"键robot.keyRelease(KeyEvent.VK_SHIFT); // 释放Shift键}
}

这些是一些基本的键盘事件示例,您可以根据需要组合它们以模拟更复杂的键盘操作。请注意,模拟键盘事件可能需要处理AWT异常(java.awt.AWTException)并确保具有足够的权限来执行这些操作。

三、鼠标事件

Java的Robot类也可以用于模拟鼠标事件,包括鼠标移动、鼠标按键按下和释放等。以下是一些常见的鼠标事件以及如何使用Robot类模拟它们:

3.1鼠标移动:

要模拟鼠标移动,您可以使用mouseMove方法,传递要移动到的屏幕坐标。例如,将鼠标移动到屏幕坐标(100, 100):

import java.awt.*;public class MouseMoveExample {public static void main(String[] args) throws AWTException {Robot robot = new Robot();robot.mouseMove(100, 100); // 移动鼠标到坐标(100, 100)}
}

3.2鼠标按键按下和释放:

要模拟鼠标按键的按下和释放事件,您可以使用mousePress和mouseRelease方法,分别传递表示鼠标按键的常量。例如,模拟按下和释放左键:

import java.awt.*;
import java.awt.event.InputEvent;public class MouseClickExample {public static void main(String[] args) throws AWTException {Robot robot = new Robot();robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); // 按下左键robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); // 释放左键}
}

3.3鼠标滚轮滚动:

若要模拟鼠标滚轮滚动,可以使用mouseWheel方法,并传递表示滚动量的整数值。正值表示向前滚动,负值表示向后滚动。例如,模拟向前滚动鼠标滚轮三次:

import java.awt.*;public class MouseWheelExample {public static void main(String[] args) throws AWTException {Robot robot = new Robot();robot.mouseWheel(3); // 向前滚动鼠标滚轮三次}
}


这些是一些基本的鼠标事件示例,您可以根据需要组合它们以模拟更复杂的鼠标操作。请注意,模拟鼠标事件也可能需要处理AWT异常(java.awt.AWTException)并确保具有足够的权限来执行这些操作。

3.4示例代码

import java.awt.*;
import java.awt.event.InputEvent;public class MouseEventsDemo {public static void main(String[] args) {try {Robot robot = new Robot();robot.setAutoDelay(500); // 设置事件之间的延迟(毫秒)// 移动鼠标到坐标(300, 300)robot.mouseMove(300, 300);// 模拟点击左键robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);// 等待一段时间robot.delay(1000);// 模拟点击右键robot.mousePress(InputEvent.BUTTON3_DOWN_MASK);robot.mouseRelease(InputEvent.BUTTON3_DOWN_MASK);// 等待一段时间robot.delay(1000);// 模拟向前滚动鼠标滚轮3次robot.mouseWheel(3);// 等待一段时间robot.delay(1000);// 模拟向后滚动鼠标滚轮2次robot.mouseWheel(-2);} catch (AWTException e) {e.printStackTrace();}}
}

四、应用

4.1屏幕截图

package org.example;import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.imageio.ImageIO;public class RobotExample {public static void main(String[] args) throws AWTException, IOException {Robot robot = new Robot();// 设置延迟(毫秒值)robot.delay(1000);// 模拟鼠标按下和释放操作int mouseButton = InputEvent.BUTTON1_DOWN_MASK; // 鼠标左键robot.mousePress(mouseButton);robot.mouseRelease(mouseButton);// 移动鼠标到指定位置(x, y)int x = 100;int y = 100;robot.mouseMove(x, y);// 模拟鼠标滚动(向下滚动)int wheelAmt = 3; // 向下滚动3格robot.mouseWheel(wheelAmt);// 模拟键盘按下和释放操作int keycode = KeyEvent.VK_WINDOWS; // Windows键robot.keyPress(keycode);robot.keyRelease(keycode);// 获取指定坐标处的像素颜色int pixelColorX = 200;int pixelColorY = 200;Color color = robot.getPixelColor(pixelColorX, pixelColorY);// 获取指定矩形区域的屏幕截图int captureX = 100;int captureY = 100;int captureWidth = 500;int captureHeight = 500;BufferedImage screenshot = robot.createScreenCapture(new Rectangle(captureX, captureY, captureWidth, captureHeight));// 保存截图为JPEG文件File outputFile = new File("D:\\桌面\\save.jpg");OutputStream os = new FileOutputStream(outputFile);ImageIO.write(screenshot, "jpg", os);}
}

4.2消息轰炸器

package auto_control;import java.awt.*;
import java.awt.event.KeyEvent;/*** @Author Javee* @Date 2019/8/11 19:54* @Description  一个简单的QQ/微信轰炸器*                 用法:把需要发送的信息先复制到电脑的粘贴板(Ctrl + C),*                 再运行此代码,然后打开需要轰炸的对象聊天窗口,点击一下*                 输入区即可自动轰炸* */
public class Boom {public static void main(String[] args) throws AWTException {Robot robot = new Robot();// 创建Robot对象int times = 50; //轰炸的次数,可以自己修改int time = 500; //两次轰炸之间相隔的时间,单位为毫秒robot.delay(3000);// 延迟三秒,主要是为了预留出打开窗口的时间,括号内的单位为毫秒for (int j = 0; j < times; j++) {//循环次数// 以下两行按下了ctrl+v,完成粘贴功能robot.keyPress(KeyEvent.VK_CONTROL);robot.keyPress(KeyEvent.VK_V);robot.keyRelease(KeyEvent.VK_CONTROL);// 释放ctrl按键,像ctrl,退格键,删除键这样的功能性按键,在按下后一定要释放,不然会出问题。crtl如果按住没有释放,在按其他字母按键是,敲出来的回事ctrl的快捷键。robot.delay(time);// 延迟发送,不然会一次性全发布出去,因为电脑的处理速度很快,每次粘贴发送的速度几乎是一瞬间,所以给人的感觉就是一次性发送了全部。这个时间可以自己改,想几秒发送一条都可以robot.keyPress(KeyEvent.VK_ENTER);// 回车robot.keyRelease(KeyEvent.VK_ENTER);}}
}

4.3自动化数据输入

import java.awt.*;
import java.awt.event.KeyEvent;public class AutoDataInput {public static void main(String[] args) {try {// 创建Robot对象Robot robot = new Robot();// 打开记事本应用程序(可根据您的需求更改应用程序路径)Runtime.getRuntime().exec("notepad.exe");Thread.sleep(2000); // 等待应用程序打开// 输入文本String textToType = "这是自动化数据输入的示例。";for (char c : textToType.toCharArray()) {int keyCode = KeyEvent.getExtendedKeyCodeForChar(c);if (KeyEvent.CHAR_UNDEFINED != keyCode) {robot.keyPress(keyCode);robot.keyRelease(keyCode);}}// 保存文档(Ctrl + S)robot.keyPress(KeyEvent.VK_CONTROL);robot.keyPress(KeyEvent.VK_S);robot.keyRelease(KeyEvent.VK_S);robot.keyRelease(KeyEvent.VK_CONTROL);// 关闭记事本(Alt + F4)robot.keyPress(KeyEvent.VK_ALT);robot.keyPress(KeyEvent.VK_F4);robot.keyRelease(KeyEvent.VK_F4);robot.keyRelease(KeyEvent.VK_ALT);} catch (AWTException | InterruptedException | java.io.IOException e) {e.printStackTrace();}}
}

相关文章:

Java入坑之Robot类

一、概述 1.1Robot类概述 在Java中&#xff0c;Robot是一个属于java.awt包的类。它还扩展了 Object 类。该类用于为测试自动化、自运行演示以及需要控制鼠标和键盘的其他应用程序生成本机系统输入事件。换句话说&#xff0c;我们使用 Java Robot 类来触发输入事件&#xff0c;…...

spring-secrity的Filter顺序+自定义过滤器

Filter顺序 Spring Security的官方文档向我们提供了filter的顺序&#xff0c;实际应用中无论用到了哪些&#xff0c;整体的顺序是保持不变的: ChannelProcessingFilter&#xff0c;重定向到其他协议的过滤器。也就是说如果你访问的channel错了&#xff0c;那首先就会在channel…...

leetcode 371. 两整数之和

异或&#xff1a;不同为1&#xff0c;相同为0&#xff0c;刚好符合加法&#xff0c;但是缺少进位的可能 按位与&#xff1a;只有都为1才为1&#xff0c;否则都为0&#xff0c;如果两个数按位与再左移一位&#xff0c;就能代表所有要进位的位 class Solution {public int getS…...

Medium: Where to Define Qualified users in A/B testing?

1. Common AB Testing Setup Issue (Framework) 局限性: unqualified users will also be considered and mess up experimentation results....

POJ 3662 Telephone Lines 二分,最小化第k大的数

一、题目大意 我们有n个点&#xff0c;p条边&#xff0c;最小化从1到n之间的路径的第k1大的数&#xff08;当路径不超过k时就是0&#xff09; 二、解题思路 我们首先用dijkstra过一遍&#xff0c;判断从1能不能到n&#xff0c;不能直接输出-1结束。 1能到达n的话&#xff0…...

【mybatis-plus进阶】多租户场景中多数据源自定义来源dynamic-datasource实现

Springbootmybatis-plusdynamic-datasourceDruid 多租户场景中多数据源自定义来源dynamic-datasource实现 文章目录 Springbootmybatis-plusdynamic-datasourceDruid 多租户场景中多数据源自定义来源dynamic-datasource实现0.前言1. 作者提供了接口2. 基于此接口的抽象类实现自…...

vue3 async await

const getStruct async () > {//首先从store读取&#xff0c;否则通过接口获取if (store.state.struct.v ! null) {return store.state.struct.v;} else {const data await getStructApi();store.dispatch("struct/keepV", data).then(() > {console.log(&qu…...

CLion远程Linux开发环境搭建及找不到Linux头文件的解决方法

CLion远程开发环境搭建及找不到Linux头文件的解决方法 文章目录 CLion远程开发环境搭建及找不到Linux头文件的解决方法1.前言2.远程开发3.远程编译4.远程调试5.远程开发Linux头文件找不到&#xff08;比如pthread.h、<sys/socket.h>&#xff09;6.最后 1.前言 在某些时候…...

Python综合案例(基本地图使用)

一、基本地图的使用 基本代码&#xff1a; """ 演示地图可视化的基本使用 """ from pyecharts.charts import Map from pyecharts.options import VisualMapOpts# 准备地图对象 map Map() # 准备数据 data [("北京", 99),("…...

maven的scope总结

scope类型 compiletestprovidedruntimesystemimport compile 编译依赖范围。如果没有指定&#xff0c;就会默认使用该依赖范围。使用此依赖范围的Maven 依赖&#xff0c;对于编译、测试、运行三种classpath 都有效。大部分是这种&#xff0c;在编译、测试和运行的时候都需要使…...

Linux执行命令

命令格式 主命令 选项 参数&#xff08;操作对象&#xff09;例如&#xff1a; 修改主机名 hostname set-hostname 新名称显示/目录下的文件的详细信息 ls -l /命令 内置命令&#xff08;builtin&#xff09;&#xff1a;shell程序自带的命令。 外部命令&#xff1a;有独立…...

Nginx 配置中root和alias的区别分析

root和alias都可以定义在location模块中&#xff0c;都是用来指定请求资源的真实路径&#xff0c;比如&#xff1a; location /i/ { root /data/w3; } 请求 http://foofish.net/i/top.gif 这个地址时&#xff0c;那么在服务器里面对应的真正的资源 是 /data/w3/i/top.gif文…...

AP51656 PWM和线性调光 LED车灯电源驱动IC 兼容替代PT4115 PT4205

产品描述 AP51656是一款连续电感电流导通模式的降压恒流源 用于驱动一颗或多颗串联LED 输入电压范围从 5V 到 60V&#xff0c;输出电流 可达 1.5A 。根据不同的输入电压和 外部器件&#xff0c; 可以驱动高达数十瓦的 LED。 内置功率开关&#xff0c;采用高端电流采样设置 …...

视频汇聚/视频云存储/视频监控管理平台EasyCVR部署后无法正常启用是什么问题?该如何解决?

安防监控/视频监控/视频汇聚平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;视频云存储/安防监控汇聚平台EasyCVR支持多种播放协议&#xff0c;包括&#xff1a;HLS、HTTP-FLV、WebSoc…...

Kubernetes v1.25.0集群搭建实战案例(新版本含Docker容器运行时)

k8s 1.24之后弃用了docker容器运行时&#xff0c;安装方式上有所不同&#xff0c;网上找到的大多数都是1.24之前的版本。所以把自己搭建的完整过程记录下来供大家参考。 一、前言 k8s的部署方式有多种kubeadm、kind、minikube、Kubespray、kops等本文介绍官方推荐的kubeadm的…...

RabbitMQ、Kafka和RocketMQ比较

一、概述 消息队列中间件&#xff08;MQ&#xff09;是不同系统之间消息传递&#xff0c;异步通信的常见组件&#xff0c;RabbitMQ、Kafka和RocketMQ是目前业界常见的3种消息中间件&#xff0c;本文重点阐述了他们特性差异、架构设计和处理常见问题的方案。 二、特性比较 Ra…...

http和https区别,第三方证书如何保证服务器可信

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;和HTTPS&#xff08;HTTP Secure&#xff09;是用于在客户端和服务器之间传输数据的协议&#xff0c;它们在以下几个方面有所区别&#xff1a; 安全性&#xff1a;HTTP是明文协议&#xff0c;数据在传输过程中不加密&…...

【内网穿透】使用Nodejs搭建简单的HTTP服务器 ,并实现公网远程访问

目录 前言 1.安装Node.js环境 2.创建node.js服务 3. 访问node.js 服务 4.内网穿透 4.1 安装配置cpolar内网穿透 4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation…...

Linux中的多线程剖析

目录 1、前言 2、多线程理解 2.1 线程 2.2 通俗了解进程和线程 2.2.1 进程是资源分配的基本单位 2.2.2 Linux中的线程是一种轻量化进程 2.3 进程和线程详解 2.3.1 创建一个线程 (pthread_create) 2.3.2 线程自己的一部分数据 2.3.3 线程组 2.3.4 关于进程的其他操作…...

uniapp 集成蓝牙打印功能(个人测试佳博打印机)

uniapp 集成蓝牙打印功能&#xff08;个人测试京博打印机&#xff09; uniapp 集成蓝牙打印功能集成佳博内置的接口 uniapp 集成蓝牙打印功能 大家好今天分析的是uniapp 集成蓝牙打印功能&#xff0c;个人开发是app,应该是支持H5(没试过) 集成佳博内置的接口 下载dome地址&…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...