【黑马java基础】特殊文件,日志

目录

  • 特殊文件:Properties属性文件
    • 特点、作用
    • 使用Properties读取属性文件里的键值对数据
    • 使用properties把键值对数据写到属性文件中去
    • 案例
  • 特殊文件:XML文件
    • 概述
    • 读取XML文件中的数据
    • 把数据写出到XML文件中去
    • 补充知识:约束XML文件的编写[了解]
  • 日志技术
    • 概述
    • 日志技术体系、Logback日志框架的概述
    • Logback快速入门
    • 日志配置文件
    • Logback设置日志级别

propeties属性文件,XML文件

为什么要用这些特殊文件?用于存储多个用户的用户名、密码,按键值对存储

  • 后缀为.properties的文件,称之为属性文件,它可以很方便的存储一些类似于键值对的数据。经常当做软件的配置文件使用。
  • 而xml文件能够表示更加复杂的数据关系,比如要表示多个用户的用户名、密码、家乡、性别等。在后面,也经常当做软件的配置文件使用。

日志技术:把程序运行的信息,记录到文件中,方便程序员定位bug、并了解程序的执行情况等

特点作用

使用程序读取它们里面的数据

使用程序把数据存储到这些文件里

特殊文件:Properties属性文件

特点、作用

  • 只能是键值对
  • 键不能重复
  • 文件后缀一般是.properties结尾的

在这里插入图片描述

properties

  • 是一个Map集合(键值对集合),但是我们一般不会当集合使用。
  • 核心作用:Properties是用来代表属性文件的,通过Properties可以读写属性文件里的内容。

使用Properties读取属性文件里的键值对数据

构造器说明
public Properties()用于构建Properties集合对象(空容器)
常用方法说明
public void load(InputStream is)通过字节输入流,读取属性文件里的键值对数据
public void load(Reader reader)通过字符输入流,读取属性文件里的键值对数据
public String getProperty(String key)根据键获取值(其实就是get方法的效果)
public Set stringPropertyNames()获取全部键的集合(其实就是ketSet方法的效果)

实用Properties读取属性文件的步骤如下

1、创建一个Properties的对象出来(键值对集合,空容器)
2、调用load(字符输入流/字节输入流)方法,开始加载属性文件中的键值对数据到properties对象中去(优先选择字符输入流)
3、调用getProperty()方法,根据键取值

代码如下:

/*** 目标:掌握使用Properties类读取属性文件中的键值对信息。*/
public class PropertiesTest1 {public static void main(String[] args) throws Exception {// 1、创建一个Properties的对象出来(键值对集合,空容器)Properties properties = new Properties();System.out.println(properties);// 2、开始加载属性文件中的键值对数据到properties对象中去properties.load(new FileReader("properties-xml-log-app\\src\\users.properties"));System.out.println(properties);// 3、根据键取值System.out.println(properties.getProperty("赵敏"));System.out.println(properties.getProperty("张无忌"));// 4、遍历全部的键和值。//获取键的集合Set<String> keys = properties.stringPropertyNames();for (String key : keys) {//再根据键获取值String value = properties.getProperty(key);System.out.println(key + "---->" + value);}//也可以使用forEach循环取出properties.forEach((k, v) -> {System.out.println(k + "---->" + v);});}
}

使用properties把键值对数据写到属性文件中去

需要用到的方法如下:

构造器说明
public Properties()用于构建Properties集合对象(空容器)
常用方法说明
public Object setProperty(String key, String value)保存键值对数据到Properties对象中去。
public void store(OutputStream os, String comments)把键值对数据,通过字节输出流写出到属性文件里去
public void store(Writer w, String comments)把键值对数据,通过字符输出流写出到属性文件里去

store()会自动关闭管道,使用后不用手动关闭

往Properties属性文件中写键值对的步骤如下

1、先准备一个.properties属性文件,按照格式写几个键值对
2、创建Properties对象出来,
3、调用setProperty存储一些键值对数据
4、调用store(字符输出流/字节输出流, 注释),将Properties集合中的键和值写到文件中注意:第二个参数是注释,必须得加;

先准备一个users.properties属性文件,如下图所示

在这里插入图片描述

接下来,编写代码读取上面的属性文件。代码如下:

public class PropertiesTest2 {public static void main(String[] args) throws Exception {// 1、创建Properties对象出来,先用它存储一些键值对数据Properties properties = new Properties();properties.setProperty("张无忌", "minmin");properties.setProperty("殷素素", "cuishan");properties.setProperty("张翠山", "susu");// 2、把properties对象中的键值对数据存入到属性文件中去properties.store(new FileWriter("properties-xml-log-app/src/users2.properties"), "i saved many users!");}
}

运行上面的代码,user2.properties 配置文件打开效果如下图所示。

在这里插入图片描述

案例

读取属性文件,判断是否存在"user2",如存在,将value改成“asasas”

package specialFile;import java.io.FileReader;
import java.io.FileWriter;
import java.util.Properties;public class PropertiesTest3 {public static void main(String[] args) throws Exception {//1、加载属性文件的键值对到程序中来Properties properties = new Properties();//2、开始加载properties.load(new FileReader("oop/src/specialFile/user.txt"));//3、判断是否包含user2这个键if (properties.containsKey("user2")) {properties.setProperty("user2","asasas");}//4、把properties对象的键值对数据重新写到属性文件中去properties.store(new FileWriter("oop/src/specialFile/user.txt"),"success!");}
}

特殊文件:XML文件

概述

XML( 全称EXtensible Markup Language, 可扩展标记语言 )

可扩展的意思就是里面的标签可以自己定义。

本质是一种数据的格式,可以用来存储复杂的数据结构,和数据关系。

XML的特点

  • XML中的“<标签名>” 称为一个标签或一个元素,一般是成对出现的。
  • XML中的标签名可以自己定义(可扩展),但必须要正确的嵌套。
  • XML中只能有一个根标签。
  • XML中的标签可以有属性。
  • 如果一个文件中放置的是XML格式的数据,这个文件就是XML文件,后缀一般要写成.xml。

XML的创建

就是创建一个XML类型的文件,要求文件的后缀必须使用xml,如hello_world.xml

XML的语法规则

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 注释:以上抬头声明必须放在第一行,必须有 -->
<!--  根标签只能有一个 -->
<users><user id="1" desc="第一个用户"><name>张无忌</name><sex></sex><地址>光明顶</地址><password>minmin</password></user><people>很多人</people><user id="2"><name>敏敏</name><sex></sex><地址>光明顶</地址><password>wuji</password></user>
</users>

上面XML文件中的数据格式是最为常见的,标签有属性、文本、还有合理的嵌套。XML文件中除了写以上的数据格式之外,还有一些特殊的字符不能直接写。

  • <,>,& 等这些符号不能出现在标签的文本中,因为标签格式本身就有<>,会和标签格式冲突。

    如果标签文本中有这些特殊字符,需要用一些占位符代替。

    &lt;  表示 <
    &gt;  表示 >
    &amp; 表示 &
    &apos; 表示 '
    &quot; 表示 "
    
    <data> 3 &lt; 2 &amp;&amp; 5 &gt; 4 </data>
    //Out:
    3 < 2 && 5 > 4
    
  • 如果在标签文本中,出现大量的特殊字符,不想使用特殊字符,此时可以用CDATA区,格式如下

    <data1><![CDATA[3 < 2 && 5 > 4]]>
    </data1>
    

XML的作用和应用场景

本质是一种数据格式,可以存储复杂的数据结构,和数据关系。

应用场景:经常用来做为系统的配置文件;或者作为一种特殊的数据结构,在网络中进行传输。

读取XML文件中的数据

使用程序读取XML文件中的数据,也就是解析XML文件。

注意:程序员并不需要自己写原始的IO流代码来解析XML,难度较大!也相当繁琐!

有很多开源的,好用的,解析XML的框架,最知名的是:Dom4j(第三方研发的)

步骤:使用Dom4J解析出XML文件

需求:使用Dom4J把一个XML文件的数据进行解析

分析:

  1. 下载Dom4j框架,官网下载。(-sources.jar可以看源码,-javadoc.jar可以看使用文档)
  2. 在项目中创建一个文件夹:lib
  3. 将dom4j-2.1.3.jar文件复制到 lib 文件夹
  4. 在jar文件上点右键,选择 Add as Library -> 点击OK
  5. 在类中导包使用

DOM4J解析XML文件的思想:文档对象模型

在这里插入图片描述

DOM4J解析XML文件的思想是:文档对象模型(意思是把整个XML文档、每一个标签、每一个属性都等都当做对象来看待)。Dowument对象表示真个XML文档、Element对象表示标签(元素)、Attribute对象表示属性、标签中的内容就是文本。

Dom4j解析XML - 得到Document对象

  • SAXReader:Dom4j提供的解析器,可以认为是代表整个Dom4j框架
构造器/方法说明
public SAXReader()构建Dom4J的解析器对象
public Document read(String url)把XML文件读成Document对象
public Document read(InputStream is)通过字节输入流读取XML文件
  • Document
方法名说明
Element getRootElement()获得根元素对象

XML解析的过程,是从根元素开始,从外层往里层解析。 所以我们先把Document对象,和根元素获取出来

public class Dom4JTest1 {public static void main(String[] args) throws Exception {// 1、创建一个Dom4J框架提供的解析器对象SAXReader saxReader = new SAXReader();// 2、使用saxReader对象把需要解析的XML文件读成一个Document对象。Document document =saxReader.read("properties-xml-log-app\\src\\helloworld.xml");// 3、从文档对象中解析XML文件的全部数据了Element root = document.getRootElement();System.out.println(root.getName());}
}

在这里插入图片描述

获取到XML文件的根元素之后,接下来,就可以用根元素在获取到它里面的子元素(包括子标签、表属性等)。需要用到以下方法:

方法名说明
public String getName()得到元素名字
public List elements()得到当前元素下所有子元素
public List elements(String name)得到当前元素下指定名字的子元素返回集合
public Element element(String name)得到当前元素下指定名字的子元素,如果有很多名字相同的返回第一个
public String attributeValue(String name)通过属性名直接得到属性值
public String elementText(子元素名)得到指定名称的子元素的文本
public String getText()得到文本

代码如下:

public class Dom4JTest1 {public static void main(String[] args) throws Exception {// 1、创建一个Dom4J框架提供的解析器对象SAXReader saxReader = new SAXReader();// 2、使用saxReader对象把需要解析的XML文件读成一个Document对象。Document document =saxReader.read("properties-xml-log-app\\src\\helloworld.xml");// 3、从文档对象中解析XML文件的全部数据了Element root = document.getRootElement();System.out.println(root.getName());// 4、获取根元素下的全部一级子元素。// List<Element> elements = root.elements();List<Element> elements = root.elements("user");for (Element element : elements) {System.out.println(element.getName());}// 5、获取当前元素下的某个子元素。Element people = root.element("people");System.out.println(people.getText());  //Out:很多人// 如果下面有很多子元素user,默认获取第一个。Element user = root.element("user");System.out.println(user.elementText("name"));   //Out: 张无忌// 6、获取元素的属性信息呢?标签里的属性System.out.println(user.attributeValue("id"));Attribute id = user.attribute("id");System.out.println(id.getName());System.out.println(id.getValue());List<Attribute> attributes = user.attributes();for (Attribute attribute : attributes) {System.out.println(attribute.getName() + "=" + attribute.getValue());}    //Out: id="1" desc="第一个用户"// 7、如何获取全部的文本内容:获取当前元素下的子元素文本值System.out.println(user.elementText("name"));//Out:张无忌System.out.println(user.elementText("地址"));//Out:光明顶System.out.println(user.elementTextTrim("地址")); // 取出文本去除前后空格System.out.println(user.elementText("password"));Element data = user.element("data");System.out.println(data.getText()); //Out: 3 &lt; 2 &amp;&amp; 5 > 4System.out.println(data.getTextTrim()); // 取出文本去除前后空格}
}

对应XML文件如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 注释:以上抬头声明必须放在第一行,必须有 -->
<!--  根标签只能有一个 -->
<users><user id="1" desc="第一个用户"><name>张无忌</name><sex></sex><地址>光明顶</地址><password>minmin</password><data> 3 &lt; 2 &amp;&amp; 5 > 4 </data><data1><![CDATA[3 < 2 && 5 > 4]]></data1></user><people>很多人</people><user id="2"><name>敏敏</name><sex></sex><地址>光明顶</地址><password>wuji</password><data> 3 &lt; 2 &amp;&amp; 5 > 4 </data><data1><![CDATA[3 < 2 && 5 > 4]]></data1></user>
</users>

把数据写出到XML文件中去

可以继续用dom4j实现,但是不建议。

推荐直接把程序中的数据拼接成XML格式,然后用IO流写出去

package com.itheima.d2_xml;import java.io.BufferedWriter;
import java.io.FileWriter;/*** 目标:如何使用程序把数据写出到 XML文件中去。* <?xml version="1.0" encoding="UTF-8" ?>* <book>*     <name>从入门到跑路</name>*     <author>dlei</author>*     <price>999.9</price>* </book>*/
public class Dom4JTest2 {public static void main(String[] args) {// 1、使用一个StringBuilder对象来拼接XML格式的数据。StringBuilder sb = new StringBuilder();sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n");sb.append("<book>\r\n");sb.append("\t<name>").append("从入门到跑路").append("</name>\r\n");sb.append("\t<author>").append("dlei").append("</author>\r\n");sb.append("\t<price>").append(999.99).append("</price>\r\n");sb.append("</book>");try (BufferedWriter bw = new BufferedWriter(new FileWriter("properties-xml-log-app/src/book.xml"));){bw.write(sb.toString());} catch (Exception e) {e.printStackTrace();}}
}

补充知识:约束XML文件的编写[了解]

就是限制XML文件只能按照某种格式进行书写。

约束文档:

专门用来限制xml书写格式的文档,比如:限制标签、属性应该怎么写。

约束文档的分类:DTD文档,Schema文档

在这里插入图片描述

<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
<!ELEMENT 书架(书+)>   表示根标签是<书架>,并且书架中有子标签<书>
<!ELEMENT 书(书名、作者、售价)> 表示书是一个标签,且书中有子标签<书名>、<作者>、<售价>
<!ELEMENT 书名(#PCDATA)>	表示<书名>是一个标签,且<书名>里面是普通文本
<!ELEMENT 作者(#PCDATA)>	表示<作者>是一个标签,且<作者>里面是普通文本
<!ELEMENT 售价(#PCDATA)>	表示<售价>是一个标签,且<售价>里面是普通文本
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE 书架 SYSTEM "data.dtd">
<书架><><书名>从入门到删库</书名><作者>小猫</作者><售价>很便宜</售价></><><书名>从入门到删库</书名><作者>小猫</作者><售价>9.9</售价></><><书名>从入门到删库</书名><作者>小猫</作者><售价>9.9</售价></>
</书架>

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"targetNamespace="http://www.itcast.cn"elementFormDefault="qualified" ><!-- targetNamespace:申明约束文档的地址(命名空间)--><element name='书架'><!-- 写子元素 --><complexType><!-- maxOccurs='unbounded': 书架下的子元素可以有任意多个!--><sequence maxOccurs='unbounded'><element name='书'><!-- 写子元素 --><complexType><sequence><element name='书名' type='string'/><element name='作者' type='string'/><element name='售价' type='double'/></sequence></complexType></element></sequence></complexType></element>
</schema>
<?xml version="1.0" encoding="UTF-8" ?>
<书架 xmlns="http://www.itcast.cn"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.itcast.cn data.xsd"><!-- xmlns="http://www.itcast.cn"  基本位置xsi:schemaLocation="http://www.itcast.cn books02.xsd" 具体的位置 --><><书名>从入门到删除</书名><作者>dlei</作者><售价>9.9</售价></><><书名>从入门到删除</书名><作者>dlei</作者><售价>0.9</售价></>
</书架>

如下图所示,左边的book2.xml文件就受到右边schame文件(.xsd结尾的文件)的约束。

在这里插入图片描述

日志技术

概述

想搞清楚什么是日志,其实可以通过下面几个问题来了解的。

  • 系统系统能记住某些数据被谁操作,比如被谁删除了?
  • 想分析用户浏览系统的具体情况,比如挖掘用户的具体喜好?
  • 当系统在开发中或者上线后出现了Bug,崩溃了,该通过什么去分析,定位Bug?

而日志就可以帮我们解决以上的问题。 用来记录程序运行过程中的信息,并可以进行永久存储。 所以日志就好比生活中的日记,日记可以记录生活中的点点滴滴;而程序中的日志,通常就是一个文件,里面记录了程序运行过程中产生的各种数据。

之前记录日志的方案是用输出语句,这样做有以下弊端:

  • 日志会展示在控制台
  • 不能更方便的将日志记录到其他的位置(文件,数据库)
  • 想取消日志,需要修改源代码才可以完成

日志技术

  • 可以将系统执行的信息,方便的记录到指定的位置(控制台、文件中、数据库中)。
  • 可以随时以开关的形式控制日志的启停,无需侵入到源代码中去进行修改。

日志技术体系、Logback日志框架的概述

日志技术的体系结构:

在这里插入图片描述

日志框架:牛人或者第三方公司已经做好的实现代码,后来者直接可以拿去使用。
日志接口:设计日志框架的一套标准,日志框架需要实现这些接口。

注意1:因为对Commons Logging接口不满意,有人就搞了SLF4J;因为对Log4j的性能不满意,有人就搞了Logback。
注意2:Logback是基于slf4j的日志规范实现的框架。

所以这里推荐使用Logback

Logback日志框架官方网站:https://logback.qos.ch/index.html

Logback日志框架有以下几个模块:

在这里插入图片描述

想使用Logback日志框架,至少需要在项目中整合如下三个模块:

  1. slf4j-api:日志接口
  2. logback-core:基础模块
  3. logback-classic:功能模块,它完整实现了slf4j API

Logback快速入门

本节需要使用Logback日志框架,纪录系统的运行信息。

实现步骤

①:将三个模块导入Logback框架到项目中去。(slf4j-api.jar, logback-core.jar, logback-classic.jar)复制到lib中,然后add as library

②:将Logback框架的核心配置文件logback.xml直接拷贝到src目录下(必须是src下)。

③:创建Logback框架提供的Logger对象,然后用Logger对象调用其提供的方法就可以记录系统的日志信息

public static final Logger LOGGER = LoggerFactory.getLogger(“类名");

开始记录日志,代码如下:

package com.itheima.d3_log;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** 目标:掌握LogBack日志框架的使用。*/
public class LogBackTest {// 创建一个Logger日志对象public static final Logger LOGGER = LoggerFactory.getLogger("LogBackTest");public static void main(String[] args) {//while (true) {try {LOGGER.info("chu法方法开始执行~~~");chu(10, 0);LOGGER.info("chu法方法执行成功~~~");} catch (Exception e) {LOGGER.error("chu法方法执行失败了,出现了bug~~~");}//}}public static void chu(int a, int b){LOGGER.debug("参数a:" + a);LOGGER.debug("参数b:" + b);int c = a / b;LOGGER.info("结果是:" + c);}
}

logback.xml文件如下(log文件会存储在红框位置中):

在这里插入图片描述

运行程序时,控制台记录的日志:

在这里插入图片描述

日志配置文件

核心配置文件logback.xml对Logback日志框架进行控制的。

  • 可以配置日志的输出位置、输出格式的设置

通常可以设置2个输出日志的位置:一个是控制台、一个是系统文件中

在这里插入图片描述

  • 可以选择开启日志(ALL),取消日志(OFF):

在这里插入图片描述
在这里插入图片描述

Logback设置日志级别

日志级别指的是日志信息的类型,日志都会分级别,常见的日志级别如下(优先级依次升高):

日志级别说明
trace追踪,指明程序运行轨迹
debug调试,实际应用中一般将其作为最低级别,而 trace 则很少使用
info输出重要的运行信息,数据连接、网络连接、IO操作等等,使用较多
warn警告信息,可能会发生问题,使用较多
error错误信息, 使用较多

在这里插入图片描述

只有日志的级别是大于或等于核心配置文件配置的日志级别,才会被记录,否则不记录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/48507.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS 本地真机运行

目录 官网地址 1.开发工具设置签名 2.手机开启开发者模式 3.使用USB连接方式 4.使用无线调试连接方式 5.常见的问题 官网地址 使用真机运行应用 使用本地真机运行应用/服务 1.开发工具设置签名 官网应用/服务签名 1.左上角文件--项目结构-勾选自动生成签名-Sign in登录 2…

Apache2服务介绍

apache2 安装使用配置web访问配置虚拟主机配置代理正向代理反向代理 官网 互联网上排名第一的 HTTP 服务器&#xff0c;Apache HTTP 服务器项目致力于开发和维护适用于现代操作系统&#xff08;包括 UNIX 和 Windows&#xff09;的开源 HTTP 服务器。该项目的目标是提供安全、…

【译】设计已死

文章概括&#xff1a; 本文探讨了人工智能&#xff08;AI&#xff09;的崛起如何可能使设计师甚至设计本身变得过时。作者借用尼采的名言“上帝已死”&#xff0c;引出设计在AI时代面临的困境&#xff0c;并分析了 AI 对设计行业的深远影响。 思维导图&#xff1a; 人类创造的…

GPT模型为什么能生成有意义的文本

GPT模型的底层&#xff0c;其实是谷歌团队推出的Transformer模型。但是在GPT-3出现之前&#xff0c;大家一直对它没有多少了解。直到它的参数数量突破1750亿个的时候&#xff0c;它才建立起一个庞大的神经网络&#xff0c;这个神经网络最突出的特点是大数据、大模型和大计算。其…

书生浦语多模态简述——学习笔记

多模态学习概念 多模态它是研究异构且相互连接数据的科学。它涵盖了从原始的器官信号到抽象概念的多种模态。 比如说我们语音和语言是我们理解人类交流的关键模态&#xff0c;而情感和图像就为我们提供了对环境和对象的感知&#xff0c;通过分析这些模态&#xff0c;我们就可…

技术成神之路:设计模式(九)观察者模式

介绍 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为设计模式。它允许一个对象&#xff08;称为主题或可观察者&#xff09;来监视并通知一组依赖于这个对象的其他对象&#xff08;称为观察者&#xff09;&#xff0c;以便在主题状态发生变化时自动更新观察者的…

Python中高效处理大数据的几种方法

随着数据量的爆炸性增长&#xff0c;如何在Python中高效地处理大数据成为了许多开发者和数据科学家的关注焦点。Python以其简洁的语法和丰富的库支持&#xff0c;在数据处理领域占据了重要地位。本文将介绍几种在Python中高效处理大数据的常用方法。 目录 1. 使用Pandas进行数…

双向链表(C语言版)

1. 双向链表的结构 注意&#xff1a;这里的“带头”跟单链表的“头结点”是两个概念&#xff0c;实际上在单链表阶段称呼不太严谨&#xff0c;但是为了更好地理解就直接称为单链表的头结点。带头链表里的头结点&#xff0c;实际为“哨兵位”&#xff0c;哨兵位结点不存储任何有…

若依Vue前后端分离版如何部署(windows)(超详细)

一、项目环境准备 下面是项目所需要准备的环境 Node.js redis 1、Node.js下载 下面进入官网可以下载Node.js — 在任何地方运行 JavaScript (nodejs.org)https://nodejs.org/zh-cn 下载完成安装后&#xff0c;需要配置环境变量&#xff0c;首先复制以下nodejs的安…

【JavaScript】箭头函数

具体讲解 之前写 this 的指向时就提到过箭头函数&#xff0c;但是由于其比较复杂&#xff0c;还是单独开一篇来讲箭头函数。 箭头函数&#xff0c;箭头函数不能作为构造函数&#xff0c;没有原型 prototype&#xff0c;不能 new。 在箭头函数中&#xff0c;this 关键字指向的是…

代码随想录Day15|| 110平衡二叉树 257二叉树的所有路径 404左叶子之和 222完全二叉树的节点个数

110平衡二叉树 力扣题目链接 题目描述 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,3,3,null,null,4,4] 输出&#xff…

深入浅出WebRTC—GCC

GoogCcNetworkController 是 GCC 的控制中心&#xff0c;它由 RtpTransportControllerSend 通过定时器和 TransportFeedback 来驱动。GoogCcNetworkController 不断更新内部各个组件的状态&#xff0c;并协调组件之间相互配合&#xff0c;向外输出目标码率等重要参数&#xff0…

昇思25天学习打卡营第17天|计算机视觉

昇思25天学习打卡营第17天 文章目录 昇思25天学习打卡营第17天ShuffleNet图像分类ShuffleNet网络介绍模型架构Pointwise Group ConvolutionChannel ShuffleShuffleNet模块构建ShuffleNet网络 模型训练和评估训练集准备与加载模型训练模型评估模型预测 打卡记录 ShuffleNet图像分…

2023 N1CTF-n1proxy

文章目录 参考rsa握手rust_proxy源码公匙交换和签名会话钥匙后续通信生命周期和裸指针代码审计漏洞点 libc-2.27.so大致思路&#xff08;exp还有变化&#xff09;调试exp泄露libc写free_hook执行命令exp 参考 https://github.com/Nu1LCTF/n1ctf-2023/tree/main/pwn/n1proxy ht…

JVM从1%到99%【精选】-运行时数据区

目录 1.运行时数据区概括 2.什么是内存溢出 3..程序计数器 4.Java虚拟机栈 5.本地方法栈 6.堆 7.方法区 8.直接内存 1.运行时数据区概括 Java虚拟机在运行Java程序过程中管理的内存区域,称之为运行时数据区。主要分为两大类&#xff1a;线程不共享、线程共享线程不共…

TypeScript中Interface接口的深度探索与实践

定义接口 在TypeScript中&#xff0c;interface是一个强有力的概念&#xff0c;它用于定义类型签名&#xff0c;特别是对象的结构。接口可以用来描述对象应该有哪些属性、方法&#xff0c;以及这些成员的类型。它们是实现类型系统中“鸭子类型”&#xff08;duck typing&#…

【22】Android高级知识之Window(三) -WMS

一、概述 这次开始到了WindowManagerService&#xff08;WMS&#xff09;&#xff0c;你可以把它看做一个WindowManager&#xff0c;只不过呢&#xff0c;属于系统服务进程&#xff08;system_server&#xff09;中的一员&#xff0c;和应用不在同一进程&#xff0c;所以涉及了…

CSS(二)——CSS 背景

CSS 背景 CSS 背景属性用于定义HTML元素的背景。 CSS 背景属性 Property描述background简写属性&#xff0c;作用是将背景属性设置在一个声明中。background-attachment背景图像是否固定或者随着页面的其余部分滚动。background-color设置元素的背景颜色。background-image把…

《程序猿学会 Vue · 基础与实战篇》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

数据结构(二叉树-1)

文章目录 一、树 1.1 树的概念与结构 1.2 树的相关术语 1.3 树的表示 二、二叉树 2.1 二叉树的概念与结构 2.2特殊的二叉树 满二叉树 完全二叉树 2.3 二叉树的存储结构 三、实现顺序结构二叉树 3.1 堆的概念与结构 3.2 堆的实现 Heap.h Heap.c 默认初始化堆 堆的销毁 堆的插入 …