统一响应,自定义校验器,自定义异常,统一异常处理器

文章目录

    • 1.基本准备(构建一个SpringBoot模块)
        • 1.在A_universal_solution模块下创建新的子模块unified-processing
        • 2.pom.xml引入基本依赖
        • 3.编写springboot启动类
        • 4.启动测试
    • 2.统一响应处理
        • 1.首先定义一个响应枚举类 RespBeanEnum.java 每个枚举对象都有code和message
        • 2.然后定义一个响应的Bean RespBean.java ,可以调用响应枚举类,进行响应
        • 3.测试使用
          • 1.目录结构
          • 2.ResponseTest.java
          • 3.浏览器测试
            • 1.成功响应,不携带数据。
            • 2.成功响应,携带数据。
            • 3.失败响应,不携带数据。
            • 4.失败响应,携带数据。
            • 5.测试withData方法。
            • 6.测试withMessage方法。
    • 3.自定义校验器
        • 1.首先编写一个Bean测试使用,LoginVo.java
        • 2.需求分析
          • 自定义校验器来校验手机号和密码
        • 3.通用校验器模板
          • 1.定义通用校验器接口 GenericValidatorInterface.java
          • 2.自定义校验注解 GenericValidation.java
          • 3.通用校验器实现类 GenericValidatorImpl.java
          • 4.使用方式
            • 1.需求分析
            • 2.将模板复制一份,放到validator包下,准备进行修改
            • 3.要校验的字段为Integer类型,也就是修改value类型
            • 4.注解中的value是int数组类型,也就是修改annotationValue的类型
            • 5.修改三个类的名字前缀为Test,直接修改然后alter +enter 让IDEA自动修改
            • 6.TestValidatorImpl.java编写校验逻辑
            • 7.修改LoginVo.java 添加测试校验字段
            • 8.编写controller加上@Valid字段进行校验
            • 9.测试
    • 4.统一异常处理器整合自定义校验器
        • 1.编写自定义异常携带响应枚举对象 CustomException.java
        • 2.编写全局异常处理器 GlobalExceptionHandler.java
        • 3.最佳实践
          • 1.当需要响应error时直接抛出自定义异常对象,指定响应枚举对象
          • 2.此时当出现参数绑定异常时也会交给统一异常处理解决
          • 3.当出现其他异常时,就会响应服务端异常,控制台也会打印错误信息

1.基本准备(构建一个SpringBoot模块)

1.在A_universal_solution模块下创建新的子模块unified-processing

image-20240506125441280

2.pom.xml引入基本依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <!-- 继承spring-boot父模块 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.4</version>
        <relativePath/> <!-- 如果交给父模块统一管理,但是又要继承springboot的父模块,就必须加这个 -->
    </parent>

    <artifactId>unified-processing</artifactId>
    <packaging>jar</packaging>

    <name>unified-processing</name>
    <url>http://maven.apache.org</url>


    <!-- 解决java: -source 1.5 中不支持 diamond 运算符 问题 -->
    <properties>
        <java.version>1.8</java.version>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>


    <dependencies>
        <!--validation 参数校验-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
            <version>2.4.5</version>
        </dependency>

        <!-- springboot两个常规配置 -->
        <!-- spring-boot-starter-web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- spring-boot-starter-test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- lombok也是常规配置 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- jupiter测试 -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.7.2</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

    <!-- maven打包插件-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

3.编写springboot启动类
package com.sun.solution;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * Description:
 *
 * @Author sun
 * @Create 2024/5/6 13:00
 * @Version 1.0
 */
@SpringBootApplication
public class UnifiedApplication {
    public static void main(String[] args) {
        SpringApplication.run(UnifiedApplication.class, args);
    }
}

4.启动测试

image-20240506130251247

2.统一响应处理

1.首先定义一个响应枚举类 RespBeanEnum.java 每个枚举对象都有code和message
package com.sxs.seckill.vo;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;

/**
 * Description: 响应枚举类
 *
 * @Author sun
 * @Create 2024/5/5 15:15
 * @Version 1.0
 */

@Getter
@AllArgsConstructor
@ToString
public enum RespBeanEnum {
    // 通用
    SUCCESS(200, "SUCCESS"),
    ERROR(500, "服务端异常"),
    //登录模块
    LOGIN_ERROR(500210, "用户名或者密码错误"),
    MOBILE_ERROR(500211, "手机号码格式不正确"),
    BING_ERROR(500212, "参数绑定异常"),
    MOBILE_NOT_EXIST(500213, "手机号码不存在"),
    PASSWORD_UPDATE_FAIL(500214, "更新密码失败");
    //其他模块。。。

    // 响应码和响应信息
    private final Integer code;
    private final String message;
}

2.然后定义一个响应的Bean RespBean.java ,可以调用响应枚举类,进行响应
package com.sxs.seckill.vo;

import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

/**
 * 通用响应数据封装类。
 * 提供了构造函数和静态方法来创建响应对象,支持链式调用来设置属性。
 */
@Getter
@Setter
@Accessors(chain = true) // 支持链式调用
public class RespBean {
    private long code;
    private String message;
    private Object data;

    /**
     * 默认构造函数。
     */
    public RespBean() {}

    /**
     * 构造函数,初始化响应码和消息。
     * @param code 响应码。
     * @param message 响应消息。
     */
    public RespBean(long code, String message) {
        this.code = code;
        this.message = message;
    }

    /**
     * 构造函数,初始化响应码、消息和数据。
     * @param code 响应码。
     * @param message 响应消息。
     * @param data 响应数据。
     */
    public RespBean(long code, String message, Object data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    /**
     * 成功响应,携带数据。
     * @param data 响应数据。
     * @return 生成的成功响应对象。
     */
    public static RespBean success(Object data) {
        return new RespBean(RespBeanEnum.SUCCESS.getCode(), RespBeanEnum.SUCCESS.getMessage(), data);
    }

    /**
     * 成功响应,不携带数据。
     * @return 生成的成功响应对象。
     */
    public static RespBean success() {
        return new RespBean(RespBeanEnum.SUCCESS.getCode(), RespBeanEnum.SUCCESS.getMessage(), null);
    }

    /**
     * 错误响应,只携带错误枚举。
     * @param respBeanEnum 错误枚举,包含错误码和消息。
     * @return 生成的错误响应对象。
     */
    public static RespBean error(RespBeanEnum respBeanEnum) {
        return new RespBean(respBeanEnum.getCode(), respBeanEnum.getMessage(), null);
    }

    /**
     * 错误响应,携带错误枚举和额外数据。
     * @param respBeanEnum 错误枚举,包含错误码和消息。
     * @param data 额外数据。
     * @return 生成的错误响应对象。
     */
    public static RespBean error(RespBeanEnum respBeanEnum, Object data) {
        return new RespBean(respBeanEnum.getCode(), respBeanEnum.getMessage(), data);
    }

    /**
     * 设置响应数据。
     * @param data 响应数据。
     * @return 当前对象,支持链式调用。
     */
    public RespBean withData(Object data) {
        this.data = data;
        return this;
    }

    /**
     * 设置响应消息。
     * @param message 响应消息。
     * @return 当前对象,支持链式调用。
     */
    public RespBean withMessage(String message) {
        this.message = message;
        return this;
    }
}

3.测试使用
1.目录结构

image-20240506131857665

2.ResponseTest.java
package com.sun.solution.conroller;

import com.sun.solution.unified_response_processing.RespBean;
import com.sun.solution.unified_response_processing.RespBeanEnum;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Description:
 *
 * @Author sun
 * @Create 2024/5/6 13:07
 * @Version 1.0
 */
@RestController
public class ResponseTest {
    /**
     * 成功响应,不携带数据。
     *
     * @return
     */
    @RequestMapping("/success1")
    public RespBean success1() {
        return RespBean.success();
    }

    /**
     * 成功响应,携带数据。
     *
     * @return
     */
    @RequestMapping("/success2")
    public RespBean success2() {
        return RespBean.success("成功响应,携带数据。");
    }


    /**
     * 失败响应,不携带数据。
     *
     * @return
     */
    @RequestMapping("/error1")
    public RespBean error1() {
        return RespBean.error(RespBeanEnum.ERROR);
    }

    /**
     * 失败响应,携带数据。
     *
     * @return
     */
    @RequestMapping("/error2")
    public RespBean error2() {
        return RespBean.error(RespBeanEnum.ERROR, "失败响应,携带数据。");
    }

    /**
     * 测试withData方法
     *
     * @return
     */
    @RequestMapping("/withData")
    public RespBean withData() {
        return RespBean.error(RespBeanEnum.ERROR).withData("测试withData方法");
    }

    /**
     * 测试withMessage方法
     *
     * @return
     */
    @RequestMapping("/withMessage")
    public RespBean withMessage() {
        return RespBean.error(RespBeanEnum.ERROR).withMessage("测试withMessage方法");
    }

}

3.浏览器测试
1.成功响应,不携带数据。

image-20240506132159483

2.成功响应,携带数据。

image-20240506132322584

3.失败响应,不携带数据。

image-20240506132344487

4.失败响应,携带数据。

image-20240506132403115

5.测试withData方法。

image-20240506132427551

6.测试withMessage方法。

image-20240506132447397

3.自定义校验器

1.首先编写一个Bean测试使用,LoginVo.java
package com.sun.solution.vo;

import lombok.Data;

/**
 * Description:
 *
 * @Author sun
 * @Create 2024/5/6 13:29
 * @Version 1.0
 */
@Data
public class LoginVo {
    private String mobile;
    private String password;
}
2.需求分析
自定义校验器来校验手机号和密码
3.通用校验器模板
1.定义通用校验器接口 GenericValidatorInterface.java
package com.sun.solution.validator;

/**
 * Description: 通用校验器接口,用于重新定义校验方法,使其更加灵活
 *
 * @Author sun
 * @Create 2024/5/6 13:34
 * @Version 1.0
 */

public interface GenericValidatorInterface {
    /**
     * 校验接口
     * @param value 待校验的值,根据情况自定义类型
     * @param annotationValue 注解中的value值,根据情况自定义类型
     * @param required 是否必填
     * @return
     */
    boolean isValid(String value, String annotationValue, boolean required);
}

2.自定义校验注解 GenericValidation.java
package com.sun.solution.validator;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

/**
 * Description: 自定义校验注解
 *
 * @Author sun
 * @Create 2024/5/6 13:38
 * @Version 1.0
 */
@Documented
@Constraint(validatedBy = GenericValidatorImpl.class) // 1.这里是校验器的实现类
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface GenericValidation {
    // 2.这里是注解的属性
    // message是校验失败时的提示信息
    String message() default "校验失败!";
    // value是注解的值,可以根据情况自定义类型,类型改变则校验器也需要改变
    String value() default "";
    // required是是否必填
    boolean required() default true;

    // 下面这两个属性必须添加,是默认属性
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

3.通用校验器实现类 GenericValidatorImpl.java
package com.sun.solution.genericvalidator;

import org.springframework.util.StringUtils;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * Description: 通用校验器实现类,ConstraintValidator<TestValidation, String>中的两个参数分别是注解和校验的值类型
 *
 * @Author sun
 * @Create 2024/5/6 13:42
 * @Version 1.0
 */
public class GenericValidatorImpl implements ConstraintValidator<GenericValidation, String>, GenericValidatorInterface {

    // 注解中的value值,根据情况自定义类型
    private String annotationValue;
    // 注解中的required值,表示是否必填
    private boolean required;

    /**
     * 初始化方法,获取注解中的value值和required值
     * @param annotation
     */
    @Override
    public void initialize(GenericValidation annotation) {
        this.annotationValue = annotation.value();
        this.required = annotation.required();
    }

    /**
     * 初始的校验方法
     * @param value
     * @param context
     * @return
     */
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return isValid(value, annotationValue, required);
    }

    /**
     * 增强的校验方法
     * @param value 待校验的值
     * @param annotationValue 注解中的value值,根据情况自定义类型
     * @param required 是否必填
     * @return
     */
    @Override
    public boolean isValid(String value, String annotationValue, boolean required) {
        // 校验逻辑编写,根据三个参数进行校验
        return false;
    }
}

4.使用方式
1.需求分析

假设,要校验的字段类型是Integer类型,注解中的value是int数组类型

2.将模板复制一份,放到validator包下,准备进行修改

image-20240506142134488

3.要校验的字段为Integer类型,也就是修改value类型

GenericValidatorInterface.java

image-20240506142712265

GenericValidatorImpl.java

image-20240506142756701

4.注解中的value是int数组类型,也就是修改annotationValue的类型

GenericValidation.java

image-20240506143335834

GenericValidatorImpl.java

image-20240506143407645

GenericValidatorInterface.java

image-20240506143434441

5.修改三个类的名字前缀为Test,直接修改然后alter +enter 让IDEA自动修改

image-20240506143656011

6.TestValidatorImpl.java编写校验逻辑
    /**
     * 增强的校验方法
     * @param value 待校验的值
     * @param annotationValue 注解中的value值,根据情况自定义类型
     * @param required 是否必填
     * @return
     */
    @Override
    public boolean isValid(Integer value, int[] annotationValue, boolean required) {
        // 如果不是必填项,且值为空,则直接返回true
        if (!required && value == null) {
            return true;
        }
        // 如果是必填项,且值为空,则直接返回false
        if (required && value == null) {
            return false;
        }
        // 如果注解中的value值不为空,且待校验的值不在value值中,则返回false
        if (annotationValue.length > 0) {
            for (int i : annotationValue) {
                if (value == i) {
                    return true;
                }
            }
            return false;
        }
        return true;
    }
7.修改LoginVo.java 添加测试校验字段
package com.sun.solution.vo;

import com.sun.solution.validator.TestValidation;
import lombok.Data;

/**
 * Description:
 *
 * @Author sun
 * @Create 2024/5/6 13:29
 * @Version 1.0
 */
@Data
public class LoginVo {
    private String mobile;
    private String password;
    @TestValidation(value = {1, 2, 3}, required = true)
    private Integer test;
}
8.编写controller加上@Valid字段进行校验
package com.sun.solution.conroller;

import com.sun.solution.unified_response_processing.RespBean;
import com.sun.solution.vo.LoginVo;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

/**
 * Description:
 *
 * @Author sun
 * @Create 2024/5/6 14:56
 * @Version 1.0
 */
@RestController
public class ValidationTest {
    @PostMapping("/test")
    public RespBean test(@Valid @RequestBody LoginVo loginVo) {
        return RespBean.success("success!");
    }
}

9.测试

image-20240506150821623

image-20240506150835102

4.统一异常处理器整合自定义校验器

1.编写自定义异常携带响应枚举对象 CustomException.java
package com.sun.solution.exception;

import com.sun.solution.unified_response_processing.RespBeanEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * Description: 自定义异常类,具有响应枚举的属性。
 *
 * @Author sun
 * @Create 2024/5/6 15:15
 * @Version 1.0
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CustomException extends RuntimeException{
    private RespBeanEnum respBeanEnum;
}

2.编写全局异常处理器 GlobalExceptionHandler.java
package com.sun.solution.exception;

import com.sun.solution.unified_response_processing.RespBean;
import com.sun.solution.unified_response_processing.RespBeanEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * Description:
 *
 * @Author sun
 * @Create 2024/5/6 15:16
 * @Version 1.0
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
    // 处理所有的异常
    @ExceptionHandler(Exception.class)
    public RespBean exceptionHandler(Exception e) {
        // 日志记录异常信息及堆栈
        log.error("Exception caught: ", e); 
        
        // 如果得到的是自定义异常的对象,那么直接返回这个异常的响应枚举类信息
        if (e instanceof CustomException) {
            CustomException ex = (CustomException) e;
            return RespBean.error(ex.getRespBeanEnum());
        } else if (e instanceof BindException) {
            // 如果是绑定异常,就获取绑定异常的message信息,返回给前端
            // 需要获取改异常 BindException,进行打印
            BindException ex = (BindException) e;
            // 获取绑定异常的信息
            RespBean respBean = RespBean.error(RespBeanEnum.BING_ERROR).withMessage("参数校验异常:" +
                    ex.getBindingResult().getAllErrors().get(0).getDefaultMessage());
            return respBean;
        }
        
        // 如果不是自定义异常,那么返回服务端异常
        return RespBean.error(RespBeanEnum.ERROR);
    }
}

3.最佳实践
1.当需要响应error时直接抛出自定义异常对象,指定响应枚举对象

image-20240506153836780

image-20240506153848112

2.此时当出现参数绑定异常时也会交给统一异常处理解决

image-20240506154042389

3.当出现其他异常时,就会响应服务端异常,控制台也会打印错误信息

image-20240506154219232

image-20240506154225690

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVMの垃圾回收

在上一篇中&#xff0c;介绍了JVM组件中的运行时数据区域&#xff0c;这一篇主要介绍垃圾回收器 JVM架构图&#xff1a; 1、垃圾回收概述 在第一篇中介绍JVM特点时&#xff0c;有提到过内存管理&#xff0c;即Java语言相对于C&#xff0c;C进行的优化&#xff0c;可以在适当的…

技术回眸一笑

回忆一下一年前的出差日记吧&#xff0c;那个时候真的是一点经验没有&#xff0c;干硬件又干软件&#xff0c;只能一步一步慢慢摸索&#xff0c;努力过后慢慢成长起来的吧。那个时候甚至开学了都没有正常报道&#xff0c;但是也收获了不少东西&#xff0c;并且也将作为我后来继…

Vue——组件数据传递与props校验

文章目录 前言组件数据传递的几种类型简单字符串类型数据专递其他类型数据(数字、数组、对象)传递注意事项 数据传递值校验限定数据类型 type给定默认值 default指定必选项 required 前言 组件与组件之间并不是完全独立的&#xff0c;他们之间可以进行一些数据的传递操作。传递…

10个高清视频素材库分享,高清高质量的分享给你

今天&#xff0c;我将为各位介绍几个极具价值的高清视频素材库。无论您是短视频创作者、自媒体运营者还是影视后期制作专家&#xff0c;这些素材库将大大提升您作品的质量。现在&#xff0c;让我们直接深入主题&#xff0c;探索这些优秀的资源平台&#xff01; 蛙学府视频素材…

使用cesiumLab使shp转为3dtlies

过程不做赘述&#xff0c;网上大把&#xff0c;说下注意事项。 1. 存储3DTiles 选项 若是打开则输出的文件为glb格式文件,因为glb文件好储存易传输跨平台。cesium可以使用但无法处理&#xff0c;例如改变颜色&#xff0c;改着色器等。若是不打开则输出的文件为bm3d格式文件,此…

ShowDoc item_id 未授权SQL注入漏洞复现

0x01 产品简介 ShowDoc 是一个开源的在线文档协作平台,它支持Markdown、图片等多种格式,方便团队成员共同编辑和分享文档。企业常见使用场景是使用其进行接口文档、内部知识库管理。 0x02 漏洞概述 2024年6月,ShowDoc官方发布新版本修复了一个SQL注入漏洞。鉴于该漏洞无前…

k8s怎么监听自定义资源的变更?(2)

接上一篇当生成下面代码之后怎么去使用呢&#xff1f; 1.生成crd文件 这里我们通过kubebuilder的一个子项目 controller-gen 来生成crd文件 https://github.com/kubernetes-sigs/controller-tools curl -L -o https://github.com/kubernetes-sigs/controller-tools; go ins…

【前端】响应式布局笔记——flex

二、Flex Flex(FlexiableBox:弹性盒子&#xff0c;用于弹性布局&#xff0c;配合rem处理尺寸的适配问题)。 1、flex-direction:子元素在父元素盒子中的排列方式。 父级元素添加&#xff1a;flex-direction: row; 父级元素添加&#xff1a;flex-direction: row-reverse; 父…

基于百度接口的实时流式语音识别系统

目录 基于百度接口的实时流式语音识别系统 1. 简介 2. 需求分析 3. 系统架构 4. 模块设计 4.1 音频输入模块 4.2 WebSocket通信模块 4.3 音频处理模块 4.4 结果处理模块 5. 接口设计 5.1 WebSocket接口 5.2 音频输入接口 6. 流程图 程序说明文档 1. 安装依赖 2.…

RPA-UiBot6.0数据采集机器人(海量信息一网打尽)内附RPA师资培训课程

前言 友友们是否曾为海量的数据信息而头疼,不知道如何从中精准抓取你所需的数据?小北的这篇博客将为你揭晓答案,让我们一起学习如何运用RPA数据采集机器人,轻松实现海量信息的快速抓取与整理,助力你的工作效率翻倍! 诚邀各位友友参与小北博客的评论,共同开启自动…

C++ Primer 总结索引 | 第十五章:面向对象程序设计

继承和动态绑定 对程序的编写 有两方面的影响&#xff1a;一是 我们可以更容易地定义与其他类相似 但不完全相同的新类&#xff1b;二是 在使用这些彼此相似的类编写程序时&#xff0c;我们可以在一定程度上 忽略掉它们的区别 在很多程序中都存在着一些相互关联 但是有细微差别…

【机器学习300问】107、自然语言处理(NLP)领域有哪些子任务?

自然语言处理&#xff08;NLP&#xff09;是计算机科学、人工智能和语言学领域的一个交叉学科&#xff0c;致力于让计算机能够理解、解析、生成和与人类的自然语言进行互动。自然语言指的是人们日常交流使用的语言&#xff0c;如英语、汉语等&#xff0c;与计算机编程语言相对。…

IO流----字节流

字节流 字节流&#xff1a;操作&#xff1a;文件字节输入输出流 &#xff1a;写入数据&#xff1a;读取数据&#xff1a;文件拷贝&#xff1a; 带缓冲区的字节输入输出流&#xff1a;拷贝文件&#xff1a;写入数据&#xff1a;读取数据: 深入 带缓冲区的字节输出流 &#xff1a…

C语言基础学习之位运算

枚举类型 enum 枚举名 { 枚举常量 //名字 }; 注意: 1.c语言中 对于枚举类型 实际上是 当作整型处理的 2.提高代码可读性&#xff0c; 写成枚举&#xff0c;可以做语法检查 3.枚举常量&#xff0c;之间用逗号隔开 4.枚举常量&#xff0c;可以给初值&#xff0c;给了初值之后&…

React(五)useEffect、useRef、useImperativeHandle、useLayoutEffect

(一)useEffect useEffect – React 中文文档 useEffect hook用于模拟以前的class组件的生命周期&#xff0c;但比原本的生命周期有着更强大的功能 1.类组件的生命周期 在类组件编程时&#xff0c;网络请求&#xff0c;订阅等操作都是在生命周期中完成 import React, { Com…

二叉树练习题(2024/6/5)

1翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,3,1]…

空间不够用了怎么办

空间告急啊哥们 整理一下清理空间有用的一些blog吧。 【linux】公共服务器如何清理过多的.cache缓存 linux根目录空间不足&#xff0c;追加空间到根目录下 【linux】linux磁盘空间 目录查看清理 和 文件查看清理

windows系统 flutter 开发环境配置

1、管理员运行powershell&#xff0c;安装&#xff1a;Chocolatey 工具&#xff0c;粘贴复制运行下列脚本: Chocolatey 官方安装文档 Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol [System.Net.ServicePointManage…

韩顺平0基础学Java——第17天

p342-373 上课的时候一部分在纸上写过了&#xff0c;就不在这里复盘了。 this可以调用本类的所有方法&#xff0c;super可以调用父类的非private方法 Test Demo Rose Jack John jack 重写equals方法&#xff1a; 15&#xff1a; 1.调用C的有参构造器 2.进入B的有参构造器…

数字化营销有哪些模式?企业采用数字营销方式有什么意义?

在当今快速发展的商业环境中&#xff0c;营销已经远远超越了传统的推广和销售概念&#xff0c;演变成一种复杂而全面的组织职能。随着信息技术的飞速发展&#xff0c;数字化营销应运而生&#xff0c;为企业与消费者之间的互动带来了革命性的改变。数字化营销不仅为企业提供了全…