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

重生之我要精通JAVA--第七周笔记

文章目录

  • IO流
    • 字符流
      • 字符流原理解析
      • flush和close方法
    • 文件拷贝代码
      • 文件加密解密
      • 修改文件中的数据
    • 缓冲流
      • 字节缓冲流
      • 字符缓冲流
      • 例题
    • 转换流
    • 序列化流
      • 序列化流/对象操作输出流
    • 反序列化流
    • 序列化流/反序列化流的细节汇总
    • 打印流
      • 字节打印流
      • 字符打印流
    • 解压缩流
    • 压缩流
    • Commons-io
      • 常见方法
      • Hutool工具包
  • 多线程
    • 并发和并行
    • 实现方式
    • 成员方法
    • 生命周期
    • 同步代码块
    • 同步方法
    • Lock锁
    • 等待唤醒机制(生产者和消费者)

IO流

字符流

字符流原理解析

  1. 创建字符输入流对象
    底层::联文件,并创建缓冲区(长度为8192的字节数)
  2. 读取数据

底层

  1. 判断缓冲区中是否有数据可以读取
  2. 缓冲区没有数据:就从文件中获取数据,装到缓冲区中,每次尽可能装满缓冲区
    如果文件中也没有数据了,返回-1
  3. 缓冲区有数据:就从缓冲区中读取
    空参的read方法:一次读取一个字节,遇到中文一次读多个字节,把字节解码并转成十进制返回
    有参的read方法:把读取字节,解码,强转三步合并了,强转之后的字符放到数组中

flush和close方法

成员方法说明
public void flush()将缓冲区中的数据,刷新到本地文件中
public void close()释放资源/关流

文件拷贝代码


public class demo1 {public static void main(String[] args) throws IOException {File src = new File("E:\\文件练习JAVA嘿嘿嘿");File dest = new File("E:\\拷贝后的地址");copydir(src, dest);}private static void copydir(File src, File dest) throws IOException {dest.mkdirs();File[] files = src.listFiles();for(File file : files){if(file.isFile()) {FileInputStream fis = new FileInputStream(file);FileOutputStream fos = new FileOutputStream(new File(dest, file.getName()));byte[] bytes = new byte[1024];int len;while((len = fis.read(bytes)) != -1){fos.write(bytes, 0, len);}fos.close();fis.close();}else {copydir(file, new File(dest, file.getName()));}}}
}

文件加密解密

public class Demo2 {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("C:\\Users\\HP\\Desktop\\111\\哈哈\\4月27日 日报.pdf");FileOutputStream fos = new FileOutputStream("C:\\Users\\HP\\Desktop\\111\\哈哈\\copy_4月27日 日报.pdf");int b;while ((b = fis.read()) != -1) {fos.write(b ^ 2);}fos.close();fis.close();}
}

修改文件中的数据

//1
public class demo1 {public static void main(String[] args) throws IOException {FileReader fr = new FileReader("a.txt");StringBuilder sb = new StringBuilder();int ch;while((ch = fr.read()) != -1) {sb.append((char) ch);}fr.close();System.out.println(sb);String str = sb.toString();String[] arrStr = str.split("-");ArrayList<Integer> list = new ArrayList<>();for(String s : arrStr) {int i = Integer.parseInt(s);list.add(i);}Collections.sort(list);System.out.println(list);FileWriter fw = new FileWriter("a.txt");for (int i = 0; i < list.size(); i++) {if(i == list.size() - 1)fw.write(list.get(i) + "");elsefw.write(list.get(i) + "-");}fw.close();}
}//2
public class demo1 {public static void main(String[] args) throws IOException {FileReader fr = new FileReader("a.txt");StringBuilder sb = new StringBuilder();int ch;while((ch = fr.read()) != -1) {sb.append((char) ch);}fr.close();Integer[] array = Arrays.stream(sb.toString().split("-")).map(new Function<String, Integer>() {@Overridepublic Integer apply(String s) {return Integer.parseInt(s);}}).sorted().toArray(new IntFunction<Integer[]>() {@Overridepublic Integer[] apply(int value) {return new Integer[value];}});FileWriter fw = new FileWriter("a.txt");for (int i = 0; i < array.length; i++) {if(i == array.length - 1)fw.write(array[i] + "");elsefw.write(array[i] + "-");}fw.close();}
}

缓冲流

字节缓冲流

方法名称说明
public BufferedInputStream(InputStream is)把基本流包装成高级流,提高读取数据的性能
public BufferedOutputStream(OutputStream os)把基本流包装成高级流,提高写出数据的性能

原理 :底层自带了长度为8192的缓冲区提高性能

字符缓冲流

方法名称说明
public BufferedReader(Reader r)把基本流变成高级流
public BufferedWriter(Writer w)把基本流变成高级流
方法名称说明
public String readLine()读取一行数据,如果没有数据可读了,会返回 null
public void newLine()跨平台的换行

例题

只能使用三次的程序

public class demo2 {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new FileReader("a.txt"));String s = br.readLine();br.close();System.out.println(s);int count = Integer.parseInt(s);count++;if(count <= 3){System.out.println("第" + count + "免费试用~~~");}else {System.out.println("使用结束啦,请充值会员继续使用~~");}BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));bw.write(count + "");bw.close();}
}

转换流

image-20240528191312059

作用1 :指定字符集读写
作用2 :字节流想要使用字符流中的方法

public class demo3 {public static void main(String[] args) throws IOException {FileReader fr = new FileReader("a.txt", Charset.forName("UTF-8"));int ch;while((ch = fr.read())!= -1)System.out.print((char)ch);fr.close();}
}

字符转换输入流:InputStreamReader
字符转换输出流:0utputStreamWriter

序列化流

可以把Java中的对象写到本地文件中

序列化流/对象操作输出流

一、构造方法

构造方法说明
public ObjectOutputStream(0utputStream out)把基本流包装成高级流

二、成员方法

成员方法说明
public final void writeObject(Object obj)把对象序列化(写出)到文件中去
public class demo4 {public static void main(String[] args) throws IOException {Student stu = new Student("xiaodu", 18);ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt"));oos.writeObject(stu);oos.close();}
}

使用对象输出流将对象保存到文件时会出现NotserializableException异常

解决方案:需要让Javabean类实现Serializable接口

public class Student implements Serializable{}

反序列化流

一、构造方法

public ObjectInputStream(InputStream in)把基本流变成高级流

二、成员方法

public Object readObject()把序列化到本地文件中的对象,读取到程序中来。
public class demo5 {public static void main(String[] args) throws IOException, ClassNotFoundException {ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.txt"));Object o = ois.readObject();System.out.println(o);}
}

transient关键字:该关键字标记的成员不参与序列化过程。

序列化流/反序列化流的细节汇总

  1. 使用序列化流将对象写到文件时,需要让Javabean类实现Serializable接口。
    否则,会出现NotSerializableException异常
  2. 序列化流写到文件中的数据是不能修改的,一旦修改就无法再次读回来了

打印流

分类:打印流一般是指:PrintStream,PrintWriter两个类
特点1:打印流只操作文件目的地,不操作数据源
特点2:特有的写出方法可以实现,数据原样写出
例如: 打印:97------文件中:97
打印:true------文件中:true
特点3:特有的写出方法,可以实现自动刷新,自动换行
打印一次数据 = 写出 + 换行 + 刷新

字节打印流

一、构造方法

构造方法说明
public PrintStream(OutputStream/File/String)关联字节输出流/文件/文件路径
public PrintStream(String fileName, Charset charset)指定字符编码
public PrintStream(OutputStream out, boolean autoFlush)自动刷新
public PrintStream(OutputStream out, boolean autoFlush, String encoding)指定字符编码且自动刷新

二、成员方法

成员方法说明
public void write(int b)常规方法: 将指定的字节写出
public void println(Xxx xx)特有方法: 打印任意数据,自动刷新,自动换行
public void print(Xxx xx)特有方法: 打印任意数据,不换行
public void printf(String format, Object... args)特有方法: 带有占位符的打印语句,不换行
public class demo6 {public static void main(String[] args) throws FileNotFoundException {PrintStream ps = new PrintStream(new FileOutputStream("a.txt"), true, Charset.forName("UTF-8"));ps.println(97);ps.println(true);ps.println("嘿嘿嘿");ps.close();}
}

字符打印流

一、构造方法

构造方法说明
public PrintWriter(Writer/File/String)关联字节输出流/文件/文件路径
public PrintWriter(String fileName, Charset charset)指定字符编码
public PrintWriter(Writer w, boolean autoFlush)自动刷新
public PrintWriter(OutputStream out, boolean autoFlush, Charset charset)指定字符编码且自动刷新

二、成员方法

成员方法说明
public void write(...)常规方法: 规则跟之前一样,写出字节或者字符串
public void println(Xxx xx)特有方法: 打印任意类型的数据并且换行
public void print(Xxx xx)特有方法: 打印任意类型的数据,不换行
public void printf(String format, Object... args)特有方法: 带有占位符的打印语句
public class demo7 {public static void main(String[] args) throws IOException {PrintWriter pw = new PrintWriter(new FileWriter("a.txt"), true);pw.println(111);pw.println(222);pw.println(333);pw.close();}
}

解压缩流

public class demo8 {public static void main(String[] args) throws IOException {File src = new File("E:\\aaa.zip");File dest = new File("E:\\");unzip(src, dest);}private static void unzip(File src, File dest) throws IOException {ZipInputStream zip = new ZipInputStream(new FileInputStream(src));ZipEntry entry;while((entry = zip.getNextEntry()) != null) {if(entry.isDirectory()) {File file = new File(dest, entry.toString());file.mkdirs();}else {FileOutputStream fos = new FileOutputStream(new File(dest, entry.toString()));int b;while ((b = zip.read()) != -1) {fos.write(b);}fos.close();zip.closeEntry();}}zip.close();}
}

压缩流

public class ZipStreamDemo2 {public static void main(String[] args) throws IOException {// 源文件路径File src =new File("E:\\TestCode\\testFile.txt");// 压缩文件存储路径File dest =new File("E:\\TestCode");// 执行文件压缩toZip(src, dest);}private static void toZip(File src, File dest) throws IOException {// 创建压缩输出流ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(new File(dest, "testFile.zip")));// 创建一个zip文件实体并添加到压缩流中ZipEntry entry = new ZipEntry(src.getName());zos.putNextEntry(entry);// 读取源文件并写入压缩流FileInputStream fis = new FileInputStream(src);int b;while ((b = fis.read()) != -1) {zos.write(b);}// 关闭当前zip条目并压缩流zos.closeEntry();zos.close();}
}

Commons-io

Commons-io是apache开源基金组织提供的一组有关io操作的开源工具包

image-20240529195757486

  1. 在项目中创建一个文件夹:lib
  2. 将jar包复制粘贴到lib文件夹
  3. 右键点击jar包,选择 Add as Library ->点击OK
  4. 在类中导包使用

常见方法

FileUtils类(文件/文件夹相关)说明
static void copyFile(File srcFile, File destFile)复制文件
static void copyDirectory(File srcDir, File destDir)复制文件夹
static void copyDirectoryToDirectory(File srcDir, File destDir)复制文件夹
static void deleteDirectory(File directory)删除文件夹
static void cleanDirectory(File directory)清空文件夹
static String readFileToString(File file, Charset encoding)读取文件中的数据变成成字符串
static void write(File file, CharSequence data, String encoding)写出数据
构造方法说明
public static int copy(InputStream input, OutputStream output)复制文件
public static int copyLarge(Reader input, Writer output)复制大文件
public static String readLines(Reader input)读取数据
public static void write(String data, OutputStream output)写出数据

Hutool工具包

相关类说明
IoUtil流操作工具类
FileUtil文件读写和操作的工具类
FileTypeUtil文件类型判断工具类
WatchMonitor目录、文件监听
ClassPathResource针对ClassPath中资源的访问封装
FileReader封装文件读取
FileWriter封装文件写入

多线程

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。

并发和并行

并发:在同一时刻,有多个指令在单个CPU上交替执行

并行:在同一时刻,有多个指令在多个CPU上同时执行

实现方式

  1. 继承Thread类的方式进行实现

    1. 自己定义一个类继承Thread
    2. 重写run方法
    3. 创建子类的对象,并启动线程
    public class demo1 {public static void main(String[] args) {MyThread t1 = new MyThread();MyThread t2 = new MyThread();t1.setName("现成1");t2.setName("现成2");t1.start();t2.start();}
    }
    public class MyThread extends Thread{@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println(getName() + "HelloWorld");}}
    }
  2. 实现Runnable接口的方式进行实现

    1. 自己定义一个类实现Runnable接口
    2. 重写里面的run方法
    3. 创建自己的类的对象
    4. 创建一个Thread类的对象,并开启线程
    public class demo1 {public static void main(String[] args) {myRun mr = new myRun();Thread t1 = new Thread(mr);Thread t2 = new Thread(mr);t1.setName("现成1");t2.setName("现成2");t1.start();t2.start();}
    }
    public class myRun implements Runnable{@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println(Thread.currentThread().getName() + "HelloWorld");}}
    }
    
  3. 利用Callable接口和Future接口方式实现(可以获取到多线程运行的结果)

    1. 创建一个类MyCallable实现Callable接口

    2. 重写ca11(是有返回值的,表示多线程运行的结果)

    3. 创建MyCa1lable的对象)表示多线程要执行的任务)

    4. 创建FutureTask的对象(作用管理多线程运行的结果)

    5. 创建Thread类的对象,并启动(表示线程)

      public class demo1 {public static void main(String[] args) throws ExecutionException, InterruptedException {MyCallable mc = new MyCallable();FutureTask<Integer> ft = new FutureTask<>(mc);Thread t1 = new Thread(ft);t1.start();Integer result = ft.get();System.out.println(result);}
      }
      public class MyCallable implements Callable<Integer> {@Overridepublic Integer call() throws Exception {int sum = 0;for (int i = 0; i <= 100; i++) {sum += i;}return sum;}
      }
      

    对比

    image-20240529223842010

成员方法

方法名称说明
String getName()返回此线程的名称
void setName(String name)设置线程的名字(构造方法也可以设置名字)
static Thread currentThread()获取当前线程的对象
static void sleep(long time)让线程休眠指定的时间,单位为毫秒
setPriority(int newPriority)设置线程的优先级
final int getPriority()获取线程的优先级
final void setDaemon(boolean on)设置为守护线程
public static void yield()出让线程/礼让线程
public static void join()插入线程/插队线程

生命周期

image-20240530200332139

同步代码块

格式

synchronized{}

特点1:锁默认打开,有一个线程进去了,锁自动关闭
特点2:里面的代码全部执行完毕,线程出来,锁自动打开

public class MyThread1 extends Thread{static int ticket = 0;static Object obj = new Object();@Overridepublic void run() {while (true) {synchronized (obj) {if(ticket < 100) {try {Thread.sleep(10);} catch (InterruptedException e) {throw new RuntimeException(e);}ticket++;System.out.println(getName() + "正在卖" + ticket + "票!!!");} else {break;}}}}
}
public class demo1 {public static void main(String[] args) {MyThread1 t1 = new MyThread1();MyThread1 t2 = new MyThread1();t1.setName("111");t2.setName("222");t1.start();t2.start();}
}

同步方法

就是把synchronized关键字加到方法上

特点1: 同步方法是锁住方法里面所有的代码

特点2:锁对象不能自己指定

非静态:this

静态:当前类的字节码文件对象

public class MyRunnable implements Runnable{int ticket = 0;@Overridepublic void run() {while (true) {try {if(method())break;} catch (InterruptedException e) {throw new RuntimeException(e);}}}private synchronized boolean method() throws InterruptedException {if(ticket == 100)return true;else{Thread.sleep(10);ticket++;System.out.println(Thread.currentThread().getName() + "@" + ticket);}return false;}
}
public class demo1 {public static void main(String[] args) {MyRunnable mr = new MyRunnable();Thread t1 = new Thread(mr);Thread t2 = new Thread(mr);Thread t3 = new Thread(mr);t1.setName("窗口1");t2.setName("窗口2");t3.setName("窗口3");t1.start();t2.start();t3.start();}
}

Lock锁

虽然我们可以理解同步代码块和同步方法的锁对象问题
但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁
为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock

Lock实现提供比使用synchronized方法和语句可以获得更广泛的锁定操作
Lock中提供了获得锁和释放锁的方法
void lock():获得锁
void unlock():释放锁

手动上锁、手动释放锁

Lock是接口不能直接实例化,这里采用它的实现类ReentrantLock来实例化
ReentrantLock的构造方法
ReentrantLock():创建一个ReentrantLock的实例

public class LockExample {  private Lock lock = new ReentrantLock();  public void doSomething() {  lock.lock(); // 手动上锁  try {  // 访问或修改共享资源的代码  // ...  } finally {  lock.unlock(); // 手动释放锁,确保在finally块中执行以处理异常  }  }  
}

等待唤醒机制(生产者和消费者)

方法名称说明
void wait()当前线程等待,直到被其他线程唤醒
void notify()随机唤醒单个线程
void notifyAll()唤醒所有线程

已经到底啦!!

相关文章:

重生之我要精通JAVA--第七周笔记

文章目录 IO流字符流字符流原理解析flush和close方法 文件拷贝代码文件加密解密修改文件中的数据 缓冲流字节缓冲流字符缓冲流例题 转换流序列化流序列化流/对象操作输出流 反序列化流序列化流/反序列化流的细节汇总打印流字节打印流字符打印流 解压缩流压缩流Commons-io常见方…...

MySQL—函数—数值函数(基础)

一、引言 首先了解一下常见的数值函数哪些&#xff1f;并且直到它们的作用&#xff0c;并且演示这些函数的使用。 二、数值函数 常见的数值函数如下&#xff1a; 注意&#xff1a; 1、ceil(x)、floor(x) &#xff1a;向上、向下取整。 2、mod(x,y)&#xff1a;模运算&#x…...

fintuning chatglm3

chatglm3介绍 ChatGLM3-6B 是 ChatGLM 系列最新一代的开源模型&#xff0c;在保留了前两代模型对话流畅、部署门槛低等众多优秀特性的基础上&#xff0c;ChatGLM3-6B 引入了如下特性&#xff1a; 更强大的基础模型&#xff1a; ChatGLM3-6B 的基础模型 ChatGLM3-6B-Base 采用…...

草台班子啊草台班子:共享电源导致的BUG(供电不足)

某日吧&#xff08;其实就是今日&#xff0c;不过什么时候我又删帖重发也不一定啊&#xff09;&#xff0c;下工厂干活&#xff0c;机器里面没多的插座&#xff08;其实一个插座都没有&#xff0c;但是有一个24V电源的的设备&#xff09;&#xff0c;于是带队的下令并着接&…...

java递归计算文件夹和文件大小

背景 背景发现电脑c盘占用过高,然而我却不清楚是哪些文件占用了磁盘空间,于是我希望用程序来帮我完成这件事。小插曲:开始的时候,我使用python来做的,结果发现效率实在是太低,最后用java重写了一波。有需要的同学可以拿去修改一些。 代码 import java.io.File; import ja…...

硬币检测电路设计

一、来源&#xff1a;凡亿教育 第一场&#xff1a;硬币检测装置原理分析、电路设计以及器件选型_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Zh4y1V7Px/?p1&vd_source43eb1cb50ad3175d7f3b9385905cd88f 二、开发软件&#xff1a;KEIL MDK 三、主控芯片&#…...

3.基础光照

从宏观上讲渲染包含了两大部分&#xff1a;决定一个像素的可见性&#xff0c;决定一个像素的光照计算 而光照模型就是用于决定在一个像素上决定怎样的渲染光照计算。 一、我们是如何看到这个世界的 1.光源 实时渲染中&#xff0c;我们通常把光源当成一个没有体积的点&#…...

Image Search-这是你的图像搜索

Image Search-这是你的图像搜索 什么是图像搜索图像搜索开通图像搜索商品图片搜索图片搜索图片新增批量操作OSS-创建bucket上传文件创建increment.meta并上传元信息导出 体验感受 什么是图像搜索 在接触一个新的产品时&#xff0c;我们首先要知道这款产品是什么&#xff1f;那…...

对GPT-4o的评价:技术革新与未来展望

目录 引言一、GPT-4o的技术背景1.1 GPT系列的发展历程1.2 GPT-4o的技术特点 二、版本间的对比分析2.1 GPT-3与GPT-4的对比2.2 GPT-4与GPT-4o的对比 三、GPT-4o的技术能力3.1 自然语言处理3.2 多模态处理3.3 任务定制化 四、个人整体感受4.1 交互体验4.2 应用场景4.3 未来展望 五…...

【TB作品】msp430f5529单片机,dht22,烟雾传感器

功能 //硬件&#xff1a;msp430f5529、dht22、LCD1602、蜂鸣器、烟雾传感器、蓝牙模块。 //功能&#xff1a;读取温湿度、烟雾浓度显示到屏幕&#xff1b; //按键调节三个报警数值&#xff1b; //温度、湿度、烟雾浓度&#xff0c;任意一个大于报警数值就蜂鸣器报警&#xff1…...

uni-app全局弹窗的实现方案

背景 为了解决uni-app 任意位置出现弹窗 解决方案 一、最初方案 受限于uni-app 调用组件需要每个页面都引入注册才可以使用&#xff0c;此方案繁琐&#xff0c;每个页面都要写侵入性比较强 二、改进方案 app端&#xff1a;新建一个页面进行跳转&#xff0c;可以实现伪弹窗…...

Love-Yi情侣网站3.0存在SQL注入漏洞

目录 1. 前言 2. 网站简介 3. 寻找特征点 3.1 第一次尝试 3.2 第二次尝试 4.资产搜索 5.漏洞复现 5.1 寻找漏洞点 5.2 进行进一步测试 5.2.1 手动测试 1.寻找字段 2.寻找回显位 3.查询当前用户 5.2.2 sqlmap去跑 6.总结 1. 前言 朋友说自己建了一个情侣网站,看到…...

自然语言处理(NLP)—— 神经网络语言处理

1. 总体原则 1.1 深度神经网络&#xff08;Deep Neural Network&#xff09;的训练过程 下图展示了自然语言处理&#xff08;NLP&#xff09;领域内使用的深度神经网络&#xff08;Deep Neural Network&#xff09;的训练过程的简化图。 在神经网络的NLP领域&#xff1a; 语料…...

SHA256计算原理

标签: SHA256计算原理;SHA256;SHA-2; SHA-256计算原理 SHA-256(Secure Hash Algorithm 256-bit)是SHA-2系列中的一种哈希算法,它由美国国家安全局(NSA)设计,并由美国国家标准与技术研究院(NIST)发布。SHA-256主要用于数据完整性验证和数字签名等领域。以下是SHA-…...

Mysql | select语句导入csv后再导入excel表格

需求 从mysql数据库中导出数据到excel 解决方案 sql导出csv文件 sql SELECT col1,col2 FROM tab_01 WHERE col3 xxx INTO OUTFILE /tmp/result.csv FIELDS TERMINATED BY , ENCLOSED BY " LINES TERMINATED BY \n;csv文件导出excel文件 1、【数据】-【导入数据】 …...

SpringBoot:手动创建应用

Spring提供了在线的Spring Initialzr在线创建Spring Boot项目&#xff0c;为了更好的理解Spring Boot项目&#xff0c;这里我们选择手动创建。 1.新建Web应用 1.1 生成工程 首先要做是创建一个Java项目&#xff0c;这里我们选择使用Maven来支持&#xff0c;使用archetype:ge…...

【LeetCode】39.组合总和

组合总和 题目描述&#xff1a; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个…...

用JS来控制遥控车(一行代码即可连接, 超简单!)

简介 有些时候我们想要做车辆的某一个功能&#xff0c;但是又不想浪费时间做整辆小车时&#xff0c;一般会去买一辆差不多的遥控车来改&#xff0c;但是那也比较麻烦&#xff0c;市面上好像也没有便宜的直接提供编程接口的遥控车。所以就自己做一个吧~。 主要是要实现向外提供…...

MyBatis-Plus如何优雅的配置多租户及分页

MyBatis-Plus如何优雅的配置多租户及分页 一、配置多租户1、步骤一2、步骤二3、步骤三步骤四 二、配置分页1、步骤一2、步骤二3、步骤三 一、配置多租户 TenantLineInnerInterceptor 是 MyBatis-Plus 提供的一个插件&#xff0c;用于实现多租户的数据隔离。通过这个插件&#…...

国产操作系统上Vim的详解01--vim基础篇 _ 统信 _ 麒麟 _ 中科方德

原文链接&#xff1a;国产操作系统上Vim的详解01–vim基础篇 | 统信 | 麒麟 | 中科方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在国产操作系统上使用Vim的详解文章。Vim是一款功能强大且高度可定制的文本编辑器&#xff0c;广泛应用于编程和日常文本编辑中。…...

如何正确理解事件溯源架构模式?

在微服务架构盛行的当下&#xff0c;DDD&#xff08;领域驱动设计&#xff09;也得到了崭新的发展。同时&#xff0c;随着DDD的不断发展&#xff0c;也诞生了一些新的设计思想和开发模式&#xff0c;今天要介绍的事件溯源是其中具有代表性的一种模式。 事件溯源模式是DDD领域中…...

【漏洞复现】电信网关配置管理系统 rewrite.php 文件上传漏洞

0x01 产品简介 中国电信集团有限公司(英文名称"China Telecom”、简称“"中国电信”)成立于2000年9月&#xff0c;是中国特大型国有通信企业、上海世博会全球合作伙伴。电信网关配置管理系统是一个用于管理和配置电信网络中网关设备的软件系统。它可以帮助网络管理员…...

线性调整率:LINE REGULATION详解

目录 一、概述 二、 举例 一、概述 LDO&#xff08;低压差线性稳压器&#xff09;的LINE REGULATION&#xff08;线路调整或线性调整&#xff09;参数是一个衡量稳压器输出稳定性的重要指标。它反映了LDO输出电压对输入电压变化的响应程度。 当输入电压在其规定的工作范围内变…...

Workfine默认首页功能详解

一、基本介绍 Workfine V6.3推出了默认的用户首页功能&#xff0c;这样用户在登入系统后就可以通过默认的首页栏进行一些业务操作。第一版的用户首页功能布局了审批&#xff0c;制单&#xff0c;业务导航&#xff0c;便捷入口&#xff0c;消息和预警六大块内容&#xff0c;后续…...

CSAPP Lab07——Malloc Lab完成思路

等不到天黑 烟火不会太完美 回忆烧成灰 还是等不到结尾 ——她说 完整代码见&#xff1a;CSAPP/malloclab-handout at main SnowLegend-star/CSAPP (github.com) Malloc Lab 按照惯例&#xff0c;我先是上来就把mm.c编译了一番&#xff0c;结果产生如下报错。搜索过后看样子应…...

简单、免费、无广告的高性能多线程文件下载工具

一、简介 1、它是一款免费、无广告的高性能多线程文件下载工具。它界面简洁&#xff0c;简单好用&#xff0c;压缩包大小仅有 0.7MB&#xff0c;目前仅支持 Windows 平台。 2、使用方法&#xff1a;点击程序左上角的【】按钮&#xff0c;将需要的链接输入进去后点击【下载】即…...

【退役之重学 SQL】什么是笛卡尔积

一、初识笛卡尔积 概念&#xff1a; 笛卡尔积是指在关系型数据库中&#xff0c;两个表进行 join 操作时&#xff0c;没有指定任何条件&#xff0c;导致生成的结果集&#xff0c;是两个表中所有行的组合。 简单来说&#xff1a; 笛卡尔积是两个表的乘积&#xff0c;结果集中的每…...

Vue3禁止 H5 界面放大与缩小功能

Vue3禁止 H5 界面放大与缩小功能 一、前言1.第一步2.第二部3.总结 一、前言 当涉及到禁止 H5 界面的放大与缩小功能时&#xff0c;Vue 3 提供了一种方便的方式来处理。我们可以使用 <script setup> 语法&#xff0c;将相关代码添加到 App.vue 组件中&#xff0c;以确保在…...

上位机图像处理和嵌入式模块部署(f407 mcu中tf卡读写和fatfs挂载)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 很早之前&#xff0c;个人对tf卡并不是很重视&#xff0c;觉得它就是一个存储工具而已。后来在移植v3s芯片的时候&#xff0c;才发现很多的soc其实…...

汽车识别项目

窗口设计 这里的代码放在py文件最前面或者最后面都无所谓 # 创建主窗口 window tk.Tk() window.title("图像目标检测系统") window.geometry(1000x650) # 设置窗口大小# 创建背景画布并使用grid布局管理器 canvas_background tk.Canvas(window, width1000, height…...