Dhatim FastExcel 读写 Excel 文件

Dhatim FastExcel 读写 Excel 文件

  • 一、说明
    • 1、主要特点
    • 2、应用场景
  • 二、使用方法
    • 1、引入依赖
    • 2、Sheet 数据
    • 3、读取 Excel
    • 4、写入 Excel

一、说明

Github 地址:Dhatim FastExcel

Dhatim FastExcel是一个高性能、轻量级的Java库,专门用于读取和写入Excel文件(包括.xlsx和.xls格式)。以下是对Dhatim FastExcel的详细介绍:

1、主要特点

  • 高速读写:FastExcel采用直接操作字节流的方式,避免了内存中创建大量对象,从而大大提高了读写速度。据官方宣称,其性能可以达到Apache POI的20倍。
  • 轻量级:FastExcel不依赖任何其他库,如Apache POI或OpenCSV,这使得它的体积更小,更容易集成到项目中。
  • 易于使用:其API设计简洁直观,无论是读取还是写入,都可以通过几行代码轻松实现。
  • 兼容性:FastExcel支持所有版本的Excel文件,包括2003版的.xls和2007及以后版本的.xlsx。
  • 多线程支持:支持多线程读写,可以在处理大型文件时充分利用多核处理器的性能。
  • 内存友好:对内存占用极低,即使处理大文件也不会造成内存压力。
  • 灵活配置:可以根据需要自定义行列读写策略,适应不同需求。

2、应用场景

  • 数据导入导出:在Web应用中,允许用户批量上传或下载Excel数据。
  • 数据分析:对大量Excel数据进行预处理或转换。
  • 自动化报告生成:基于模板快速生成大量个性化的Excel报表。

二、使用方法

1、引入依赖

<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>

    <groupId>com.wxhntmy</groupId>
    <artifactId>dhatim-fastexcel</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>

    <name>dhatim-fastexcel</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>

        <fastexcel.version>0.18.4</fastexcel.version>
        <commons-io.version>2.16.1</commons-io.version>
        <commons-lang3.version>3.16.0</commons-lang3.version>
        <log4j.version>2.24.0</log4j.version>
        <slf4j.version>2.0.16</slf4j.version>
        <fastjson2.version>2.0.32</fastjson2.version>
        <junit-jupiter.version>5.10.2</junit-jupiter.version>
        <junit-platform.version>1.10.2</junit-platform.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.dhatim</groupId>
            <artifactId>fastexcel</artifactId>
            <version>${fastexcel.version}</version>
        </dependency>
        <dependency>
            <groupId>org.dhatim</groupId>
            <artifactId>fastexcel-reader</artifactId>
            <version>${fastexcel.version}</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>${commons-io.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>${commons-lang3.version}</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
            <version>${fastjson2.version}</version>
        </dependency>


        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-reload4j</artifactId>
            <version>${slf4j.version}</version>
        </dependency>


        <!--junit5-->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>${junit-jupiter.version}</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit-jupiter.version}</version>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-runner</artifactId>
            <version>${junit-platform.version}</version>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-launcher</artifactId>
            <version>${junit-platform.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-console-standalone</artifactId>
            <version>${junit-platform.version}</version>
            <scope>test</scope>
        </dependency>

    </dependencies>
</project>

2、Sheet 数据

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 表格数据实体类
 */
public class SheetData {

    /**
     * Sheet 名称
     */
    private String sheetName;

    /**
     * 表头
     */
    private List<String> header = new ArrayList<>();

    /**
     * List<Map<String, String>> 的表格数据
     */
    private List<Map<String, String>> dataMapList = new ArrayList<>();

    public List<Map<String, String>> getDataMapList() {
        return dataMapList;
    }

    public void setDataMapList(List<Map<String, String>> dataMapList) {
        this.dataMapList = dataMapList;
    }

    public List<String> getHeader() {
        return header;
    }

    public void setHeader(List<String> header) {
        this.header = header;
    }

    public String getSheetName() {
        return sheetName;
    }

    public void setSheetName(String sheetName) {
        this.sheetName = sheetName;
    }
}

3、读取 Excel

import org.dhatim.fastexcel.reader.ReadableWorkbook;
import org.dhatim.fastexcel.reader.Row;
import org.dhatim.fastexcel.reader.Sheet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Stream;

public class FastExcelRead {

    private static final Logger logger = LoggerFactory.getLogger(FastExcelRead.class);

    /**
     * 读取Excel文件第 1 个Sheet
     *
     * @param file  Excel文件
     * @return sheet数据
     */
    public static SheetData read(File file) {
        return read(file, 0);
    }

    /**
     * 读取Excel文件第 index 个Sheet
     *
     * @param file  Excel文件
     * @param sheetName Sheet名称
     * @return sheet数据
     */
    public static SheetData read(File file, String sheetName) {
        SheetData sheetData = new SheetData();
        try (InputStream is = new FileInputStream(file); ReadableWorkbook wb = new ReadableWorkbook(is)) {
            Optional<Sheet> sheetOptional = wb.findSheet(sheetName);
            if (sheetOptional.isEmpty()) {
                throw new RuntimeException("读取Sheet数据失败!");
            }
            Sheet sheet = sheetOptional.get();
            sheetData.setSheetName(sheet.getName());
            List<Row> rows = sheet.read();
            Row header = rows.get(0);
            List<String> headerList = new ArrayList<>();
            for (int i = 0; i < header.getCellCount(); i++) {
                headerList.add(header.getCellText(i));
            }
            sheetData.setHeader(headerList);
            List<Map<String, String>> dataMapList = getDataMapList(rows, headerList);
            sheetData.setDataMapList(dataMapList);
        } catch (Exception e) {
            logger.error("Error: ", e);
        }
        return sheetData;
    }

    /**
     * 读取Excel文件第 index 个Sheet
     *
     * @param file  Excel文件
     * @param index Sheet下标
     * @return sheet数据
     */
    public static SheetData read(File file, int index) {
        SheetData sheetData = new SheetData();
        try (InputStream is = new FileInputStream(file); ReadableWorkbook wb = new ReadableWorkbook(is)) {
            Optional<Sheet> sheetOptional = wb.getSheet(index);
            if (sheetOptional.isEmpty()) {
                throw new RuntimeException("读取Sheet数据失败!");
            }
            Sheet sheet = sheetOptional.get();
            sheetData.setSheetName(sheet.getName());
            List<Row> rows = sheet.read();
            Row header = rows.get(0);
            List<String> headerList = new ArrayList<>();
            for (int i = 0; i < header.getCellCount(); i++) {
                headerList.add(header.getCellText(i));
            }
            sheetData.setHeader(headerList);
            List<Map<String, String>> dataMapList = getDataMapList(rows, headerList);
            sheetData.setDataMapList(dataMapList);
        } catch (Exception e) {
            logger.error("Error: ", e);
        }
        return sheetData;
    }

    /**
     * 使用流读取Excel文件第 index 个Sheet(逐行读取)
     *
     * @param file  Excel文件
     * @param index Sheet下标
     * @return sheet数据
     */
    public static SheetData readByStream(File file, int index) {
        SheetData sheetData = new SheetData();
        try (InputStream is = new FileInputStream(file); ReadableWorkbook wb = new ReadableWorkbook(is)) {
            Optional<Sheet> sheetOptional = wb.getSheet(index);
            if (sheetOptional.isEmpty()) {
                throw new RuntimeException("读取Sheet数据失败!");
            }
            Sheet sheet = sheetOptional.get();
            sheetData.setSheetName(sheet.getName());

            try (Stream<Row> rows = sheet.openStream()) {
                AtomicInteger cnt = new AtomicInteger();
                List<String> headerList = new ArrayList<>();
                List<Map<String, String>> dataMapList = new ArrayList<>();
                rows.forEach(r -> {
                    //表头
                    if (cnt.get() == 0) {
                        for (int i = 0; i < r.getCellCount(); i++) {
                            headerList.add(r.getCellText(i));
                        }
                        sheetData.setHeader(headerList);
                    }
                    //数据行
                    else {
                        Map<String, String> rowMap = new HashMap<>();
                        for (int j = 0; j < sheetData.getHeader().size(); j++) {
                            if (j > r.getCellCount()) {
                                rowMap.put(sheetData.getHeader().get(j), "");
                            } else {
                                rowMap.put(sheetData.getHeader().get(j), r.getCellText(j));
                            }
                        }
                        dataMapList.add(rowMap);
                    }
                    cnt.getAndIncrement();
                });
                sheetData.setDataMapList(dataMapList);
            }
        } catch (Exception e) {
            logger.error("Error: ", e);
        }
        return sheetData;
    }

    /**
     * 数据转换
     *
     * @param rows       读取到的 List<Row>
     * @param headerList 读取到的表头
     * @return 转换后的数据 List<Map<String, String>>
     */
    private static List<Map<String, String>> getDataMapList(List<Row> rows, List<String> headerList) {
        List<Map<String, String>> dataMapList = new ArrayList<>();
        for (int i = 1; i < rows.size(); i++) {
            Row row = rows.get(i);
            Map<String, String> rowMap = new HashMap<>();
            for (int j = 0; j < headerList.size(); j++) {
                if (j > row.getCellCount()) {
                    rowMap.put(headerList.get(j), "");
                } else {
                    rowMap.put(headerList.get(j), row.getCellText(j));
                }
            }
            dataMapList.add(rowMap);
        }
        return dataMapList;
    }

}

4、写入 Excel

import org.apache.commons.lang3.StringUtils;
import org.dhatim.fastexcel.Color;
import org.dhatim.fastexcel.Workbook;
import org.dhatim.fastexcel.Worksheet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;

public class FastExcelWrite {

    private static final Logger logger = LoggerFactory.getLogger(FastExcelWrite.class);

    /**
     * 写入Excel文件
     *
     * @param file      Excel文件
     * @param sheetData Sheet数据
     */
    public static void write(File file, SheetData sheetData) {

        try (OutputStream os = new FileOutputStream(file); Workbook wb = new Workbook(os, "MyApplication", "1.0")) {

            logger.info(">>>>>写入Excel文件:{}", file.getAbsolutePath());
            // 设置全局默认字体
            wb.setGlobalDefaultFont("宋体", 12);
            logger.info(">>>>>设置全局默认字体为宋体,字号12");
            if (StringUtils.isEmpty(sheetData.getSheetName())){
                sheetData.setSheetName("Sheet1");
            }
            Worksheet ws = wb.newWorksheet(sheetData.getSheetName());

            List<String> header = sheetData.getHeader();
            List<Map<String, String>> dataMapList = sheetData.getDataMapList();
            // 冻结第1行
            ws.freezePane(0, 1);

            logger.info(">>>>>冻结表头....");
            // 命名单元格区域(单元格区域的名称只能包含字母、数字和下划线)
            ws.range(0, 0, 0, header.size()).setName("header");
            // 在单元格区域设置样式
            ws.range(0, 0, 0, header.size()).style().horizontalAlignment("center").italic().set();
            // 设置字体颜色和加粗显示
            ws.range(0, 0, 0, header.size()).style().bold().fontColor(Color.RED).fillColor(Color.GREEN).set();
            logger.info(">>>>>设置表头样式....");
            //开启筛选
            ws.setAutoFilter(0, 0, header.size() - 1);
            logger.info(">>>>>开启筛选....");

            setWorksheetData(ws, header, dataMapList);

        } catch (Exception e) {
            logger.error("Error: ", e);
        }
    }

    /**
     * 给工作表写入数据
     *
     * @param ws          Worksheet
     * @param header      表头
     * @param dataMapList 行数据
     */
    private static void setWorksheetData(Worksheet ws, List<String> header, List<Map<String, String>> dataMapList) {
        logger.info(">>>>>写入表头....");
        // 第一行为表头
        for (int j = 0; j < header.size(); j++) {
            ws.value(0, j, header.get(j));
        }
        logger.info(">>>>>写入表头完成....");
        logger.info(">>>>>写入数据行....");
        //第二行开始为数据
        for (int i = 1; i < dataMapList.size(); i++) {
            for (int j = 0; j < header.size(); j++) {
                ws.value(i, j, dataMapList.get(i).get(header.get(j)));
            }
        }
        logger.info(">>>>>写入数据行完成....");
    }

    /**
     * 同一个Excel文件写入多个Sheet
     * 每个工作表由不同的线程生成
     *
     * @param file          Excel文件
     * @param sheetDataList Sheet数据
     */
    public static void writeMultipleSheet(File file, List<SheetData> sheetDataList) {
        try (OutputStream os = new FileOutputStream(file); Workbook wb = new Workbook(os, "MyApplication", "1.0")) {
            logger.info(">>>>>写入Excel文件:{}", file.getAbsolutePath());
            // 设置全局默认字体
            wb.setGlobalDefaultFont("宋体", 12);
            logger.info(">>>>>设置全局默认字体为宋体,字号12");
            List<CompletableFuture<Void>> futureList = new ArrayList<>(sheetDataList.size());
            int sheetIndex = 1;
            for (SheetData sheetData : sheetDataList) {
                if (StringUtils.isEmpty(sheetData.getSheetName())){
                    sheetData.setSheetName("Sheet" + sheetIndex);
                }
                sheetIndex++;
                Worksheet ws = wb.newWorksheet(sheetData.getSheetName());
                CompletableFuture<Void> cf = CompletableFuture.runAsync(() -> {
                    List<String> header = sheetData.getHeader();
                    List<Map<String, String>> dataMapList = sheetData.getDataMapList();
                    // 冻结第1行
                    ws.freezePane(0, 1);
                    logger.info(">>>>>冻结表头....");
                    // 命名单元格区域(单元格区域的名称只能包含字母、数字和下划线)
                    ws.range(0, 0, 0, header.size()).setName("header");
                    // 在单元格区域设置样式
                    ws.range(0, 0, 0, header.size()).style().horizontalAlignment("center").italic().set();
                    // 设置字体颜色和加粗显示
                    ws.range(0, 0, 0, header.size()).style().bold().fontColor(Color.RED).fillColor(Color.GREEN).set();
                    logger.info(">>>>>设置表头样式....");
                    //开启筛选
                    ws.setAutoFilter(0, 0, header.size() - 1);
                    logger.info(">>>>>开启筛选....");
                    setWorksheetData(ws, header, dataMapList);
                });
                futureList.add(cf);
            }
            // 等待所有线程完成
            CompletableFuture.allOf(futureList.toArray(new CompletableFuture[0])).get();
        } catch (Exception e) {
            logger.error("Error: ", e);
        }
    }
}

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

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

相关文章

解析mysqlbinlog

一、前置设置 ps -ef | grep mysql 查看mysql进程对应的安装目录 需设置mysql binlog日志模式为 ROW 二、执行命令 [rootlocalhost bin]# mysqlbinlog --verbose --base64-outputdecode-rows /usr/local/mysql/data/binlog.000069 > 1.sql 查看文件具体内容

理解神经网络

神经网络是一种模拟人类大脑工作方式的计算模型&#xff0c;是深度学习和机器学习领域的基础。 基本原理 神经网络的基本原理是模拟人脑神经系统的功能&#xff0c;通过多个节点&#xff08;也叫神经元&#xff09;的连接和计算&#xff0c;实现非线性模型的组合和输出。每个…

基于Vue.js和SpringBoot的笔记记录分享网站的设计与实现(文末附源码)

博主介绍&#xff1a;✌全网粉丝50W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HLM…

信息安全管理与评估赛题第9套

全国职业院校技能大赛 高等职业教育组 信息安全管理与评估 赛题九 模块一 网络平台搭建与设备安全防护 1 赛项时间 共计180分钟。 2 赛项信息 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段 网络平台搭建与设备安全防护 任务1 网络平台搭建 XX:XX- XX:XX 50 任务2…

怎么在idea中创建springboot项目

最近想系统学习下springboot&#xff0c;尝试一下全栈路线 从零开始&#xff0c;下面将叙述下如何创建项目 环境 首先确保自己环境没问题 jdkMavenidea 创建springboot项目 1.打开idea&#xff0c;选择file->New->Project 2.选择Spring Initializr->设置JDK->…

【计算机视觉基础CV-图像分类】05 - 深入解析ResNet与GoogLeNet:从基础理论到实际应用

引言 在上一篇文章中&#xff0c;我们详细介绍了ResNet与GoogLeNet的网络结构、设计理念及其在图像分类中的应用。本文将继续深入探讨如何在实际项目中应用这些模型&#xff0c;特别是如何保存训练好的模型、加载模型以及使用模型进行新图像的预测。通过这些步骤&#xff0c;读…

【CDN】快速了解CDN是什么?以及工作原理和应用场景

快速了解CDN是什么&#xff1f;以及工作原理和应用场景 一、什么是CDN&#xff1f;CDN相关的术语解释 二、CDN工作原理三、CDN与传统网站的区别四、CDN的作用和意义五、CDN的应用场景 一、什么是CDN&#xff1f; CDN英文全称Content Delivery Network&#xff0c;中文翻译即为内…

leetcode 2295.替换数组中的元素

1.题目要求: 2.题目代码: class Solution { public:vector<int> arrayChange(vector<int>& nums, vector<vector<int>>& operations){map<int,int> element_index;//创建图存入元素和元素对应的下标for(int i 0;i < nums.size()…

clickhouse-题库

1、clickhouse介绍以及架构 clickhouse一个分布式列式存储数据库&#xff0c;主要用于在线分析查询 2、列式存储和行式存储有什么区别&#xff1f; 行式存储&#xff1a; 1&#xff09;、数据是按行存储的 2&#xff09;、没有建立索引的查询消耗很大的IO 3&#xff09;、建…

记录一个SVR学习

1、为什么使用jupter来做数据预测&#xff1f;而不是传统pycharm编辑器 1、Jupyter Notebook 通过anaconda统一管理环境&#xff0c;可以运行python、R、Sql等数据分析常用语言。 2、做到交互式运行&#xff0c;可以逐步运行代码块&#xff0c;实时查看结果&#xff0c;便于调…

【WRF教程第3.2期】预处理系统 WPS详解:以4.5版本为例

预处理系统 WPS 详解&#xff1a;以4.5版本为例 WPS 嵌套域&#xff08;WPS Nested Domains&#xff09;USGS 和 MODIS 土地利用重力波拖拽方案静态数据&#xff08;Gravity Wave Drag Scheme Static Data&#xff09;1. 什么是重力波拖拽方案&#xff08;GWDO&#xff09;静态…

Stealthy Attack on Large Language Model based Recommendation

传统RS依赖id信息进行推荐&#xff0c;攻击&#xff1a;生成虚假用户&#xff0c;这些用户对特定目标物体给于高评价&#xff0c;从而影响模型的训练。 基于llm的RS&#xff1a;llm利用语义理解&#xff0c;将用户兴趣转化为语义向量&#xff0c;通过计算用户兴趣向量与物品向…

Pytorch | 从零构建EfficientNet对CIFAR10进行分类

Pytorch | 从零构建EfficientNet对CIFAR10进行分类 CIFAR10数据集EfficientNet设计理念网络结构性能特点应用领域发展和改进 EfficientNet结构代码详解结构代码代码详解MBConv 类初始化方法前向传播 forward 方法 EfficientNet 类初始化方法前向传播 forward 方法 训练过程和测…

【Linux 网络 (五)】Tcp/Udp协议

Linux 网络 一前言二、Udp协议1&#xff09;、Udp协议特点2&#xff09;、Udp协议格式3&#xff09;、Udp报文封装和解包过程4&#xff09;、UDP的缓冲区 三、TCP协议1&#xff09;、TCP协议特点2&#xff09;、TCP协议格式1、4位首部长度、源端口、目的端口2、16位窗口大小3、…

重温设计模式--命令模式

文章目录 命令模式的详细介绍C 代码示例C代码示例2 命令模式的详细介绍 定义与概念 命令模式属于行为型设计模式&#xff0c;它旨在将一个请求封装成一个对象&#xff0c;从而让你可以用不同的请求对客户端进行参数化&#xff0c;将请求的发送者和接收者解耦&#xff0c;并且能…

Python langchain ReAct 使用范例

0. 介绍 ReAct: Reasoning Acting &#xff0c;ReAct Prompt 由 few-shot task-solving trajectories 组成&#xff0c;包括人工编写的文本推理过程和动作&#xff0c;以及对动作的环境观察。 1. 范例 langchain version 0.3.7 $ pip show langchain Name: langchain Ver…

Java设计模式 —— 【结构型模式】外观模式详解

文章目录 概述结构案例实现优缺点 概述 外观模式又名门面模式&#xff0c;是一种通过为多个复杂的子系统提供一个一致的接口&#xff0c;而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口&#xff0c;外部应用程序不用关心内部子系统的具体的细节&#xff0c;这…

【自用】通信内网部署rzgxxt项目_01,后端pipeDemo部署(使用nssm.exe仿照nohup)

做完这些工作之后&#xff0c;不要忘记打开 Windows Server 的防火墙端口&#xff0c;8181、8081、8080、22、443、1521 做完这些工作之后&#xff0c;不要忘记打开 Windows Server 的防火墙端口&#xff0c;8181、8081、8080、22、443、1521 做完这些工作之后&#xff0c;不要…

Apache RocketMQ 5.1.3安装部署文档

官方文档不好使&#xff0c;可以说是一坨… 关键词&#xff1a;Apache RocketMQ 5.0 JDK 17 废话少说&#xff0c;开整。 1.版本 官网地址&#xff0c;版本如下。 https://rocketmq.apache.org/download2.配置文件 2.1namesrv端口 在ROCKETMQ_HOME/conf下 新增namesrv.pro…

【网络安全】网站常见安全漏洞—服务端漏洞介绍

文章目录 网站常见安全漏洞—服务端漏洞介绍引言1. 第三方组件漏洞什么是第三方组件漏洞&#xff1f;如何防范&#xff1f; 2. SQL 注入什么是SQL注入&#xff1f;如何防范&#xff1f; 3. 命令执行漏洞什么是命令执行漏洞&#xff1f;如何防范&#xff1f; 4. 越权漏洞什么是越…