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

【java 13天进阶Day12】XML和Dom4j,装饰模式,工厂模式,commons-io工具包,Base64

XML

  • XML 指可扩展标记语言(EXtensible Markup Language),由各种标记(元素==标签)组成。

  • 可扩展:所有的标签都是自定义的,可以随意扩展的,如 。

  • XML 是一种标记语言,很类似 HTML,HTML文件也是XML文档。

  • XML 的设计宗旨是传输数据,而非显示数据。

  • XML作用:数据交换、数据存储和作为配置文件。

  • XML 标签没有被预定义。您需要自行定义标签,标签区分大小写。

  • XML 文件后缀为。xml。

  • 格式

    • <?xml version="1.0" encoding="UTF-8"?>
      <person id="110"><age>18</age>		<!--年龄--><name>张三</name>	  <!--姓名--><sex/>				<!--性别-->
      </person>
      
    • 必须要有文件抬头

    • 只能有一个根标签。


XML 与 HTML 的主要差异

  • XML 不是 HTML 的替代。
  • XML 和 HTML 为不同的目的而设计。
  • XML 被设计为传输和存储数据,其焦点是数据的内容。
  • HTML 被设计用来显示数据,其焦点是数据的外观。
  • HTML 旨在显示信息,而 XML 旨在传输信息。

XML由七种组成元素构成

  1. 声明(抬头)

  2. 元素(标签)

    • 区分大小写
    • 不能有空格、冒号
    • 有且只能有一个根元素
    • 声明中常用的属性 version encoding
  3. 属性

    • 属性只能在开始标签中,不能在结束标签中
    • 必须使用引号,单/双引号都可以
    • 同一个标签中可以有多个属性,但不能同名
    • 属性名中不能有空格和冒号
  4. 注释

  5. 实体字符

    • 不能使用特殊字符会与xml文件本身冲突,需使用转义字符

    • 说明字符转义字符
      小于<& l t;
      大于>& g t;
      双引号"& q u o t;
      单引号& a p o s;
      与符号&& a m p;
  6. CDATA 字符数据区(可写特殊字符)

  7. 处理指令

  8. <?xml version="1.0" encoding="UTF-8" ?>
    <?xml-stylesheet type="text/css" href="../css/xml.css" ?>
    <!-- 7.处理指令:导入外部的css样式控制xml的界面效果,没有啥用,xml不是为了展示好看的!-->
    <!-- 1.申明 抬头 必须在第一行-->
    <!-- 2.注释,本处就是注释,必须用前后尖括号围起来 -->
    <!-- 3.标签(元素),注意一个XML文件只能有一个根标签-->
    <student><!-- 4.属性信息:id , desc--><name id="1" desc="高富帅">西门庆</name><age>32</age><!-- 5.实体字符:在xml文件中,我们不能直接写小于号,等一些特殊字符会与xml文件本身的内容冲突报错,此时必须用转义的实体字符。--><sql><!-- select * from student where age < 18 && age > 10; -->select * from student where age &lt; 18 &amp;&amp; age &gt; 10;</sql><!-- 6.字符数据区:在xml文件中,我们不能直接写小于号,等一些特殊字符会与xml文件本身的内容冲突报错,此时必须用转义的实体字符或者也可以选择使用字符数据区,里面的内容可以随便了!--><sql2><![CDATA[select * from student where age < 18 && age > 10;]]></sql2>
    </student>
    

文件约束

  • DTD(拓展名:.dtd)和Schema,开发中不需要自己写约束文件,了解会配置即可。

  • DTD缺点:不能验证数据类型

  • Schema特点

    • 约束文件本身也是一个xml文件,它本身也会被其他xsd文档约束。
    • 内置多种数据类型,可以检测数据类型是否正确。
    • 支持命名空间,一个xml文件可以同时引入多个xsd的约束文件,让约束规则使用。
    • 扩展名:xsd,XML Schema Definition

XML的解析

  • DOM
    • 思想:一次性把XML加载到内存中,称为Dom树,然后操作解析它。
    • JAXP
    • JDOM
    • Dom4J(第三方公司研发的,性能优于JDOM,代码简单,高度面向对象)
    • Jsoup
    • 缺点:占内存。
  • SAX
    • 思想:一行一行的解析XML文件,基于事件驱动。
    • 缺点:使用过的元素不能再次访问,只能查找不能修改。

DOM解析

  • xml文件document文档数对象DOM树

  • DOM4j中DOM树的API

    组成说明
    Document当前解析的XML文档对象
    NodeXML中节点,它是其它所有节点对象的父接口
    Element代表一个元素(标签)
    Attribute代表一个属性
    Text代表标签中文本
  • dom4j属于第三方技术,必须导入该框架!!

  • dom4j安装步骤:

    • a.去dom4j官网下载dom4j的框架:都是一些jar包。
    • b.把dom4j的核心jar包导入到当前项目中去。
    • c.在项目中创建一个文件夹:lib
    • d.将dom4j-2.1.1.jar文件复制到 lib 文件夹
    • e.在jar文件上点右键,选择 Add as Library -> 点击OK
    • f.在类中导包使用
  • Java提供了Class下的一个方法:public InputStream getResourceAsStream(String path) – 用于加载文件成为一个字节输入流返回!!


dom4j获取根元素

  • Element getRootElement()

  • public static void main(String[] args) throws Exception {// 需求:解析books.xml文件成为一个Document文档树对象,得到根元素对象。// 1.创建一个dom4j的解析器对象:代表整个dom4j框架。SAXReader saxReader = new SAXReader();// 2.第一种方式(简单):通过解析器对象去加载xml文件数据,成为一个Document文档树对象。//Document document = saxReader.read(new File("Day13Demo/src/books.xml"));// 3.第二种方式(代码多点)先把xml文件读成一个字节输入流// 这里的“/”是直接去src类路径下寻找文件。InputStream is = Dom4JDemo01.class.getResourceAsStream("/books.xml");Document document = saxReader.read(is);System.out.println(document);// 4.从document文档树对象中提取根元素对象Element root = document.getRootElement();System.out.println(root.getName());
    }
    

dom4j获取子元素

  • String getName():取元素的名称。

  • List elements():获取当前元素下的全部子元素(一级)

  • List elements(String name):获取当前元素下的指定名称的全部子元素(一级)

  • Element element(String name):获取当前元素下的指定名称的某个子元素,默认取第一个(一级)

  • public static void main(String[] args) throws Exception {// 需求:解析books.xml文件成为一个Document文档树对象,得到根元素对象。// 1.创建一个dom4j的解析器对象:代表整个dom4j框架。SAXReader saxReader = new SAXReader();// 2.第一种方式(简单):通过解析器对象去加载xml文件数据,成为一个Document文档树对象。Document document = saxReader.read(new File("Day13Demo/src/books.xml"));// 3.获取根元素对象Element root = document.getRootElement();System.out.println(root.getName());// 4.获取根元素下的全部子元素List<Element> sonElements = root.elements();for (Element sonElement : sonElements) {System.out.println(sonElement.getName());}System.out.println("-------------------");// 5.获取根源下的全部book子元素List<Element> sonElements1 = root.elements("book");for (Element sonElement : sonElements1) {System.out.println(sonElement.getName());}System.out.println("-------------------");// 6.获取根源下的指定的某个元素Element son = root.element("user");System.out.println(son.getName());// 默认会提取第一个名称一样的子元素对象返回!Element son1 = root.element("book");System.out.println(son1.attributeValue("id"));
    }
    

dom4j获取属性信息

  • List attributes(): 获取元素的全部属性对象。

  • Attribute attribute(String name):根据名称获取某个元素的属性对象。

  • String attributeValue(String var1):直接获取某个元素的某个属性名称的值。

  • Attribute对象的API:

    • String getName(): 获取属性名称。
    • String getValue(): 获取属性值。
  • public static void main(String[] args) throws Exception {// 1.创建一个dom4j的解析器对象:代表整个dom4j框架。SAXReader saxReader = new SAXReader();// 2.第一种方式(简单):通过解析器对象去加载xml文件数据,成为一个Document文档树对象。Document document = saxReader.read(new File("Day13Demo/src/books.xml"));// 3.获取根元素对象。Element root = document.getRootElement();// 4.获取book子元素Element bookEle = root.element("book");// 5.获取book元素的全部属性对象List<Attribute> attributes = bookEle.attributes();for (Attribute attribute : attributes) {System.out.println(attribute.getName() + "=>" + attribute.getValue());}// 6.获取Book元素的某个属性对象Attribute descAttr = bookEle.attribute("desc");System.out.println(descAttr.getName() + "--->" + descAttr.getValue());// 7.可以直接获取元素的属性值System.out.println(bookEle.attributeValue("id"));System.out.println(bookEle.attributeValue("desc"));
    }
    

Dom4j解析XML的文本

  • String elementText(String name): 可以直接获取当前元素的子元素的文本内容

  • String elementTextTrim(String name): 去前后空格,直接获取当前元素的子元素的文本内容

  • String getText():直接获取当前元素的文本内容。

  • String getTextTrim():去前后空格,直接获取当前元素的文本内容。

  • public static void main(String[] args) throws Exception {// 1.创建一个dom4j的解析器对象:代表整个dom4j框架。SAXReader saxReader = new SAXReader();// 2.第一种方式(简单):通过解析器对象去加载xml文件数据,成为一个Document文档树对象。Document document = saxReader.read(new File("Day13Demo/src/books.xml"));// 3.获取根元素对象。Element root = document.getRootElement();// 4.得到第一个子元素bookElement bookEle = root.element("book");// 5.直接拿到当前book元素下的子元素文本值System.out.println(bookEle.elementText("name"));System.out.println(bookEle.elementTextTrim("name")); // 去前后空格System.out.println(bookEle.elementText("author"));System.out.println(bookEle.elementTextTrim("author")); // 去前后空格System.out.println(bookEle.elementText("sale"));System.out.println(bookEle.elementTextTrim("sale")); // 去前后空格// 6.先获取到子元素对象,再获取该文本值Element bookNameEle = bookEle.element("name");System.out.println(bookNameEle.getText());System.out.println(bookNameEle.getTextTrim());// 去前后空格
    }
    

XPath检索XML中的信息

  • 引入:Dom4J可以用于解析整个XML的数据。但是如果要检索XML中的某些信息,建议使用XPath.

  • XPath使用步骤:

    • 1.导入dom4j框架。(XPath依赖于Dom4j技术,必须先倒入dom4j框架!)
    • 2.导入XPath独有的框架包。jaxen-1.1.2.jar
  • XPath常用API:

    • List selectNodes(String var1):检索出一批节点集合。
    • Node selectSingleNode(String var1):检索出一个节点返回。
  • XPath提供的四种检索数据的写法:

    • 1.绝对路径,/根元素/子元素/子元素。

      • public void path01() throws Exception {// 1.创建一个dom4j的解析器对象:代表整个dom4j框架。SAXReader saxReader = new SAXReader();// 2.第二种方式(代码多点)先把xml文件读成一个字节输入流// 这里的“/”是直接去src类路径下寻找文件。InputStream is = Dom4JDemo01.class.getResourceAsStream("/Contact.xml");Document document = saxReader.read(is);// 3.使用绝对路径定位全部的name名称List<Node> nameNodes = document.selectNodes("/contactList/contact/name");for (Node nameNode : nameNodes) {System.out.println(nameNode.getText());}
        }
        
    • 2.相对路径, ./子元素/子元素。 (.代表了当前元素)。

      • public void path02() throws Exception {// 1.创建一个dom4j的解析器对象:代表整个dom4j框架。SAXReader saxReader = new SAXReader();// 2.第二种方式(代码多点)先把xml文件读成一个字节输入流// 这里的“/”是直接去src类路径下寻找文件。InputStream is = Dom4JDemo01.class.getResourceAsStream("/Contact.xml");Document document = saxReader.read(is);// 3.得到根元素对象Element root = document.getRootElement();// 4.从根元素开始检索// .代表当前根元素对象路径!直接找其下的contact下的nameList<Node> nameNodes = root.selectNodes("./contact/name");for (Node nameNode : nameNodes) {System.out.println(nameNode.getText());}
        }
        
    • 3.全文搜索。

      • //元素 在全文找这个元素

      • //元素1/元素2 在全文找元素1下面的一级元素2

      • //元素1//元素2 在全文找元素1下面的全部元素2

      • public void path03() throws Exception {// 1.创建一个dom4j的解析器对象:代表整个dom4j框架。SAXReader saxReader = new SAXReader();// 2.第二种方式(代码多点)先把xml文件读成一个字节输入流// 这里的“/”是直接去src类路径下寻找文件。InputStream is = Dom4JDemo01.class.getResourceAsStream("/Contact.xml");Document document = saxReader.read(is);// 3.//name是指在整个xml文件中检索name节点!List<Node> nameNodes = document.selectNodes("//name");for (Node nameNode : nameNodes) {System.out.println(nameNode.getText());}System.out.println("-----------------");// 4.在全文中检索所有contact下的直接name节点List<Node> nameNodes1 = document.selectNodes("//contact/name");for (Node nameNode : nameNodes1) {System.out.println(nameNode.getText());}System.out.println("-----------------");// 5.在全文中检索所有contact下的所有name节点List<Node> nameNodes2 = document.selectNodes("//contact//name");for (Node nameNode : nameNodes2) {System.out.println(nameNode.getText());}
        }
        
    • 4.属性查找。

      • //@属性名称 在全文检索属性对象。

      • //元素[@属性名称] 在全文检索包含该属性的元素对象。

      • //元素[@属性名称**=**值] 在全文检索包含该属性的元素且属性值为该值的元素对象。

      • public void path04() throws Exception {// 1.创建一个dom4j的解析器对象:代表整个dom4j框架。SAXReader saxReader = new SAXReader();// 2.第二种方式(代码多点)先把xml文件读成一个字节输入流// 这里的“/”是直接去src类路径下寻找文件。InputStream is = Dom4JDemo01.class.getResourceAsStream("/Contact.xml");Document document = saxReader.read(is);// 3.检索全部属性对象List<Node> attributs = document.selectNodes("//@id");for (Node attribut : attributs) {Attribute attr = (Attribute) attribut;System.out.println(attr.getName() + "--->" + attr.getValue());}System.out.println("---------------");// 4.//元素[@属性名称]  在全文检索包含该属性的元素对象List<Node> nodeEles = document.selectNodes("//contact[@id]");for (Node nodeEle : nodeEles) {System.out.println(nodeEle.getName());}System.out.println("---------------");// 5. //元素[@属性名称=值]  在全文检索包含该属性的元素且属性值为该值的元素对象。Node nodeEle = document.selectSingleNode("//contact[@id=2]");Element ele = (Element) nodeEle;System.out.println(ele.elementTextTrim("name"));}
        

工厂模式

  • 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。

  • 这种类型的设计模式属于创建型模式,它提供了一种创建对象的方式。

  • 之前我们创建类对象时, 都是使用new 对象的形式创建, 除new 对象方式以外,工厂模式也可以创建对象.

  • 工厂设计模式的作用:

    • 1.对象通过工厂的方法创建返回,工厂的方法可以为该对象进行加工和数据注入。
    • 2.可以实现类与类之间的解耦操作(核心思想,重点)
  • 小结:

    • 优点:工厂模式的存在可以改变创建对象的方式,解决类与类之间的耦合。
    • 缺点:工厂设计模式多了一个工厂类!!!
  • public abstract class Animal {public abstract void run();
    }public class Cat extends Animal {@Overridepublic void run() {System.out.println("猫跑的贼溜~~~~");}
    }public class Dog extends Animal {@Overridepublic void run() {System.out.println("狗跑的也贼溜~~~~");}
    }public class FactoryPattern {// 生产对象的方法:工厂方法public static Animal createAniaml() {return new Cat();}}public static void main(String[] args) {Animal a = FactoryPattern.createAniaml(); //若未来需要将业务改为狗,无需修改此处代码,直接修改工厂方法返回狗对象即可,其余所有对象都不需要改动,实现类的解耦a.run();
    }
    

装饰模式

  • 装饰模式指的是在不改变原类, 动态地扩展一个类的功能。

  • 思想:是创建一个新类,包装原始类,从而在新类中提升原来类的功能!!

  • 装饰模式可以在不改变原类的基础上对类中的方法进行扩展增强,实现原则为:

    • 1.定义父类。
    • 2.定义原始类,继承父类,定义功能。
    • 3.定义装饰类,继承父类,包装原始类,增强功能!!
  • public abstract class InputStream {public abstract void read();public abstract void close();
    }public class FileInputStream extends InputStream {@Overridepublic void read() {System.out.println("读取数据~~~");}@Overridepublic void close() {System.out.println("关闭流~~~");}
    }public class BufferedInputStrem extends InputStream {private InputStream is;public BufferedInputStrem(InputStream is) {this.is = is;}@Overridepublic void read() {System.out.println("开启高效缓冲读取~");is.read();}@Overridepublic void close() {is.close();}
    }public static void main(String[] args) {InputStream is = new BufferedInputStrem(new FileInputStream());is.read();is.close();
    }
    

Commons-io包的使用介绍

  • commons-io是apache开源基金组织提供的一组有关IO操作的类库,
  • 可以挺提高IO功能开发的效率。commons-io工具包提供了很多有关io操作的类,
  • 见下表:
功能描述
org.apache.commons.io有关Streams、Readers、Writers、Files的工具类
org.apache.commons.io.input输入流相关的实现类,包含Reader和InputStream
org.apache.commons.io.output输出流相关的实现类,包含Writer和OutputStream
  • 步骤:
    • 下载commons-io相关jar包;http:*//commons.apache.org/proper/commons-io/
    • 把commons-io-2.6.jar包复制到指定的Module的lib目录中
    • 将commons-io-2.6.jar加入到classpath中
  • 小结:IOUtils和FileUtils可以方便的复制文件和文件夹!!
public static void main(String[] args) throws Exception {// 1.完成文件复制!IOUtils.copy(new FileInputStream("Day13Demo/src/books.xml"), new FileOutputStream("Day13Demo/new.xml"));// 2.完成文件复制到某个文件夹下!FileUtils.copyFileToDirectory(new File("Day13Demo/src/books.xml"), new File("D:/itcast"));// 3.完成文件夹复制到某个文件夹下!FileUtils.copyDirectoryToDirectory(new File("D:\\itcast\\约吧图片服务器"), new File("D:\\"));//  Java从1.7开始提供了一些nio, 自己也有一行代码完成复制的技术。Files.copy(Paths.get("Day13Demo/src/books.xml"), new FileOutputStream("Day13Demo/new11.txt"));
}

base64

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。

在Java 8中,Base64编码已经成为Java类库的标准。

Java 8 内置了 Base64 编码的编码器和解码器。

Base64工具类提供了一套静态方法获取下面三种BASE64编解码器:

  • **基本:**输出被映射到一组字符A-Za-z0-9+/,编码不添加任何行标,输出的解码仅支持A-Za-z0-9+/。
  • **URL:**输出映射到一组字符A-Za-z0-9+_,输出是URL和文件。
  • **MIME:**输出隐射到MIME友好格式。输出每行不超过76字符,并且使用’\r’并跟随’\n’作为分割。编码输出最后没有行分割。

Base64内嵌类和方法描述

内嵌类

序号内嵌类 & 描述
1static class Base64.Decoder该类实现一个解码器用于,使用 Base64 编码来解码字节数据。
2static class Base64.Encoder该类实现一个编码器,使用 Base64 编码来编码字节数据

方法

序号方法名 & 描述
1**static Base64.Decoder getDecoder()**返回一个 Base64.Decoder ,解码使用基本型 base64 编码方案。
2**static Base64.Encoder getEncoder()**返回一个 Base64.Encoder ,编码使用基本型 base64 编码方案。
3**static Base64.Decoder getMimeDecoder()**返回一个 Base64.Decoder ,解码使用 MIME 型 base64 编码方案。
4**static Base64.Encoder getMimeEncoder()**返回一个 Base64.Encoder ,编码使用 MIME 型 base64 编码方案。
5**static Base64.Encoder getMimeEncoder(int lineLength, byte[] lineSeparator)**返回一个 Base64.Encoder ,编码使用 MIME 型 base64 编码方案,可以通过参数指定每行的长度及行的分隔符。
6**static Base64.Decoder getUrlDecoder()**返回一个 Base64.Decoder ,解码使用 URL 和文件名安全型 base64 编码方案。
7**static Base64.Encoder getUrlEncoder()**返回一个 Base64.Encoder ,编码使用 URL 和文件名安全型 base64 编码方案。

**注意:**Base64 类的很多方法从 java.lang.Object 类继承。


代码演示

public static void main(String args[]) {try {// 1-1.基本编码后结果。普通文本的编码String rs1 = Base64.getEncoder().encodeToString("黑马程序员".getBytes());System.out.println(rs1); // 6buR6ams56iL5bqP5ZGY// 1-2.基本解码后结果。普通文本的解码byte[] buffer = Base64.getDecoder().decode(rs1);System.out.println(new String(buffer));// 2-1.URL编码String rs2 = Base64.getUrlEncoder().encodeToString("?loginName=黑马&passWord=123456".getBytes());System.out.println(rs2);// 2-2 URL解码byte[] buffer2 = Base64.getUrlDecoder().decode(rs2);System.out.println(new String(buffer2));// 3-1 MIME编码StringBuilder sb = new StringBuilder();for (int i = 0; i < 10; ++i) {sb.append(UUID.randomUUID().toString());}String rs3 = Base64.getMimeEncoder().encodeToString(sb.toString().getBytes());System.out.println(rs3);// 3-2 MIME解码byte[] buffer3 = Base64.getMimeDecoder().decode(rs3);System.out.println(new String(buffer3));} catch (Exception e) {System.out.println("Error :" + e.getMessage());}
}

ps:b站课程《黑马程序员Java13天进阶》根据官方笔记结合自身情况整理的笔记
视频链接

相关文章:

【java 13天进阶Day12】XML和Dom4j,装饰模式,工厂模式,commons-io工具包,Base64

XML XML 指可扩展标记语言&#xff08;EXtensible Markup Language&#xff09;&#xff0c;由各种标记(元素标签)组成。 可扩展&#xff1a;所有的标签都是自定义的&#xff0c;可以随意扩展的&#xff0c;如 。 XML 是一种标记语言&#xff0c;很类似 HTML&#xff0c;HTML…...

vue3 Element-plus修改内置样式复现代码

笔者在修改Element-plus的内置样式时&#xff0c;遇到一点挫折&#xff0c;现提供需求场景与解决方案。 一、实现&#xff08;1&#xff09;透明弹窗可拖拽&#xff0c;且不影响点击弹窗外内容&#xff1b;&#xff08;2&#xff09;弹窗内置表格&#xff0c;表格需修改样式颜色…...

工作督导 | 具有边缘型人格障碍倾向的高危来访者,咨询师如何应对?

一个学校心理中心&#xff0c;可能同时有几十位乃至数百位同学在接受咨询&#xff0c;其中大约10-20%是重点难点个案&#xff0c;一次督导如果只能督导1-2个个案&#xff0c;不足以保障所有危重难个案的有如何处理恰当、方向正确、快速解决、高效工作&#xff0c;是学校心理咨询…...

一本通 2063:【例1.4】牛吃牧草 1005:地球人口承载力估计

Topic&#xff1a; Ideas&#xff1a; 为什么把这两道题放在一起呢&#xff1f;就是因为这两道题很类似&#xff0c;都是很简单的数学题&#xff0c;只要你会列出数学等式&#xff0c;你就学会这道题了&#xff01; 下面把计算过程展示给大家 Code&#xff1a; //2025/04/18…...

图+文+语音一体化:多模态合成数据集构建的实战与方法论

目录 图文语音一体化&#xff1a;多模态合成数据集构建的实战与方法论 一、多模态合成数据的核心价值 二、系统架构概览 三、核心模块与实现建议 ✅ 1. 文→图&#xff1a;图像合成&#xff08;Text-to-Image&#xff09; ✅ 2. 图→文&#xff1a;自动描述&#xff08;I…...

c++:c++中的输入输出(二)

1.getline getline是包含于头文件&#xff1a;<string>的函数 作用&#xff1a;读取一行字符串&#xff08;包含空格&#xff09; 使用格式&#xff1a;getline(cin,str); string a;getline(cin, a); 假设我们有一个场景是需要识别一行字符串中的字母a的个数&#xff0c;…...

UniApp + Cursor + Devbox 全栏平台开发教程:从0到完整项目打造

本文基于B站热门教程《一口气学会小程序 / App / H5开发:UniApp教程 + Cursor + Devbox》,https://www.bilibili.com/video/BV1W7QZYMEus/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=a1428945043b2df41c1896acb90d942a,进行全面扩展…...

电流模式控制学习

电流模式控制 电流模式控制&#xff08;CMC&#xff09;是开关电源中广泛使用的一种控制策略&#xff0c;其核心思想是通过内环电流反馈和外环电压反馈共同调节占空比。相比电压模式控制&#xff0c;CMC具有更快的动态响应和更好的稳定性&#xff0c;但也存在一些固有缺点。 …...

服务器架构:SMP、NUMA、MPP及Docker优化指南

文章目录 引言 一、服务器架构基础1. SMP&#xff08;对称多处理&#xff0c;Symmetric Multiprocessing&#xff09;2. NUMA&#xff08;非统一内存访问&#xff0c;Non-Uniform Memory Access&#xff09;3. MPP&#xff08;大规模并行处理&#xff0c;Massively Parallel Pr…...

人脸识别联合行为检测的办公管理新模式

基于人脸识别与行为检测的办公智能化解决方案 一、背景 在传统办公场景中&#xff0c;员工考勤管理、工位使用情况统计、安全监控等环节存在诸多痛点。例如&#xff0c;传统考勤方式如指纹打卡、刷卡等存在代打卡现象&#xff0c;考勤数据不准确&#xff1b;对于员工是否在工…...

Python 写生成 应用商店(2025版) 网页 方便收集应用 ,局域网使用

工具【1】&#xff1a;nginx 配置 nginx.conf 文件 server { listen 8080; server_name example.com; location / { root E:/BIT_Soft_2025; index index.html index.htm; } # 定义错误页面 error_page 404 /4…...

Spring 单元测试核心注解全解:@InjectMocks、@MockBean、@Mock、@Autowired 的区别与实战

在编写 Spring Boot 应用的单元测试过程中,@InjectMocks、@MockBean、@Mock 和 @Autowired 是最常用的几个注解,但它们经常被混淆或误用,导致测试失败或注入错误。 本文将从本质区别、使用场景、示例代码、对比表格等多个维度,全面解析这几者的使用方法与差异,助你写出结…...

2025年大一训练-DP1

2025年大一训练-DP1 Problem A: 动态规划算法&#xff0c;从上往下一层层找到到达对应位置的最大值&#xff0c;最底下一行maxl的最大值即为答案 #include<bits/stdc.h> using namespace std; int lst[101][101]; int maxl[101][101];int main() {int n,i,j;while(cin&g…...

【java 13天进阶Day04】常用API、正则表达式,泛型、Collection集合API

Math类的使用。 Math用于做数学运算。Math类中的方法全部是静态方法&#xff0c;直接用类名调用即可。方法&#xff1a; public static int abs(int a) 获取参数a的绝对值public static double ceil(double a) 向上取整public static double floor(double a) 向下取整public s…...

conversation_template | conversation_actors | conversation_line_template

目录 conversation_template conversation_actors conversation_line_template 实例应用 conversation_template id&#xff1a;某段谈话的唯一编号FirstLineId&#xff1a;谈话开始的第一段话的编号&#xff0c;取值来源 ConversationLine.db2 的 ID 字段TextureKitId&am…...

架构图--架构师的行军地图

架构图是架构师最重要的沟通和规划工具之一&#xff0c;它如同行军地图般指导着整个软件系统的构建与演进。本文系统性地探讨了软件架构图设计的全面方法论&#xff0c;提出横向与纵向双维度的设计框架。横向设计关注模块间的业务、数据与重要性关系&#xff0c;纵向设计则采用…...

`get_peft_model` 是 `peft` 库什么方法

get_peft_model 是 peft 库什么方法 get_peft_model 是 peft 库中一个关键的方法,其作用是将 LoRA 配置应用到预训练模型上,使得模型能够使用 LoRA 技术进行高效微调。 整体逻辑概述 get_peft_model 方法的核心任务是遍历预训练模型的各个模块,识别出需要应用 LoRA 的目标…...

OpenHarmony-Risc-V上运行openBLAS中的benchmark

OpenHarmony-Risc-V上运行openBLAS中的benchmark 文章目录 OpenHarmony-Risc-V上运行openBLAS中的benchmark前言一、编译openBLAS1.源码下载2.工具链下载3.编译并安装openBLAS 二、编译open BLAS中的benchmark三、上设备运行总结 前言 参考https://zhuanlan.zhihu.com/p/18825…...

HAL库通过FATFS和SDIO+DMA写入SD卡数据错误

HAL库F4版本 1.28.1 最近在使用HAL库配置SDIODMA并通过FATFS向SD卡写入数据&#xff0c;但是发现写入的数据经常有错误&#xff0c;不是少了一部分就是多了一部分&#xff0c;写入的数据为csv格式&#xff0c;通过循环向缓冲区写入"100100,12.345678\r\n"数据来观察问…...

深入解析 Python 中的装饰器 —— 从基础到实战

1. 装饰器基础 1.1 什么是装饰器&#xff1f; 装饰器本质上是一个 Python 函数&#xff0c;它可以让其他函数在不需要做任何代码变动的前提下增加额外功能。装饰器的返回值也是一个函数对象。 1.2 语法糖&#xff1a; 符号 Python 提供了 符号作为装饰器的语法糖&#xff0c…...

【Java并发】Java并发编程之CountDownLatch详解:原理、使用场景与代码实战

摘要 在Java多线程编程中&#xff0c;CountDownLatch 是一个强大的同步工具类&#xff0c;用于协调多个线程的执行顺序&#xff0c;线程间的同步是一个常见的需求。CountDownLatch 作为 java.util.concurrent 包中的一个同步辅助类&#xff0c;提供了一种简单而有效的方式来实…...

python-图片分割

图片分割是图像处理中的一个重要任务&#xff0c;它的目标是将图像划分为多个区域或者对象&#xff0c;例如分割出物体、前景背景或特定的部分。在 Python 中&#xff0c;常用的图片分割方法包括传统的图像处理技术&#xff08;例如阈值分割、区域生长等&#xff09;和深度学习…...

江湖路远,唯PUT可稳:Express 路由更新招式全解

前言 江湖传闻,后端开发如同修炼绝世武功:有人精通 POST 掌,横扫千军;有人修习 GET 指法,探查万象。而真正踏入高阶境界的高手,常常默默修炼一门冷门却威力极强的秘技,PUT 神功。 今日时机正好,你我相逢于码海江湖,不如来一场技术切磋,也许能悟出更新之道,功力再上…...

MySQL:Join连接的原理

连接查询的执行过程&#xff1a; 确定第一个需要查询的表【驱动表】 选取代价最小的访问方法去执行单表查询语句 从驱动表每获取到一条记录&#xff0c;都需要到t2表中查找匹配的记录 两表连接查询需要查询一次t1表&#xff0c;两次t2表&#xff0c;在两表的连接查询中&…...

2025.04.14【Table】| 生信数据表图技巧

Custom title A set of examples showing how to customize the titles of a table made with GT Custom footer How to customize the footer and the references section of a gt table 文章目录 Custom titleCustom footer 生信数据可视化&#xff1a;Table图表详解1. R语…...

方案解读:虚拟电厂标杆项目整体建设方案【附全文阅读】

在电力市场背景下,传统电力现货市场存在电能定价不合理、分布式电源并网困难等问题。本虚拟电厂标杆项目旨在研究全时间尺度虚拟电厂智能管控关键技术,通过研制虚拟电厂控制器样机、开发运行管理平台,实现对分布式能源的合理优化配置。项目内容涵盖虚拟调控、建设目标、建设…...

使用Trae CN分析项目架构

架构分析后的截图 A区是打开的项目、B区是源码区、C区是AI给出当前项目的架构分析结果。 如何用 Trae CN 快速学习 STM32 嵌入式项目架构 在嵌入式开发领域&#xff0c;快速理解现有项目的架构是一项关键技能。Trae CN 作为一款强大的分析工具&#xff0c;能帮助开发者高效剖…...

【Python3】Django 学习之路

第一章&#xff1a;Django 简介 1.1 什么是 Django&#xff1f; Django 是一个高级的 Python Web 框架&#xff0c;旨在让 Web 开发变得更加快速和简便。它鼓励遵循“不要重复自己”&#xff08;DRY&#xff0c;Don’t Repeat Yourself&#xff09;的原则&#xff0c;并提供了…...

浏览器缩放后 element ui组件偏移

一、需求&#xff1a;当body的有了zoom值之后&#xff0c;element ui相关的popper弹框&#xff08;下拉框、日期选择框、分页组件&#xff09;位置都会出现偏移问题 二、问题来源 popper弹框都会需要根据屏幕x,y的坐标来设置位置&#xff0c;但是有了zoom值之后&#xff0c;x,y…...

FPGA学习——DE2-115开发板上设计波形发生器

1. 实验目的 掌握直接数字频率合成&#xff08;DDS&#xff09;技术的基本原理和应用。使用DE2-115开发板实现正弦波和方波的生成。使用SignalTap II嵌入式逻辑分析仪测试输出波形的离散数据。 2. 实验原理 DDS技术&#xff1a;通过相位累加器生成相位信息&#xff0c;结合波…...