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

将HTML转换为PDF:使用Spire.Doc的详细指南(一) 试用版

目录

引言

1. 为什么选择 Spire.Doc?

1.1 主要特点

1.2 适用场景

2. 准备工作

2.1 引入 Spire.Doc 依赖

2.2 禁用 SSL 证书验证

3. 实现功能

3.1 主类结构

3.2 代码解析

4. 处理图像

5. 性能优化

5.1 异步下载图像

示例代码

5.2 批量处理优化

示例代码

6. 错误处理与日志管理

6.1 错误处理

示例代码

6.2 日志管理

示例代码

7. 总结


引言

在现代软件开发中,生成 PDF 文档的需求日益增长,尤其是在金融、教育、医疗等行业。PDF 格式以其固定的外观和出色的可移植性受到广泛欢迎。本文将详细介绍如何使用 Spire.Doc 库将 HTML 文件转换为 PDF 文件。本文包括完整代码示例、相关依赖管理,以及对过程中的关键概念的深入探讨。

1. 为什么选择 Spire.Doc?

Spire.Doc 是一款强大的 .NET 文档处理库,支持多种文档格式的创建、编辑和转换。使用 Spire.Doc 可以简化 HTML 转 PDF 的过程,支持复杂的 HTML 内容,包括图片、样式和链接等。

1.1 主要特点

  • 无依赖:Spire.Doc 不依赖于 Microsoft Office,可以直接在服务器端运行。
  • 高性能:能够快速处理和转换文档。
  • 易于使用:提供友好的 API 接口,便于开发者快速上手。

1.2 适用场景

  • 生成报表:将动态生成的 HTML 报告转换为 PDF。
  • 文档归档:将在线文档归档为 PDF,便于存储和分发。
  • 邮件发送:将用户生成的内容转换为 PDF,并通过邮件发送。

2. 准备工作

在开始之前,请确保你的开发环境中已配置 Java,并安装了 IDE(如 IntelliJ IDEA 或 Eclipse)。接下来,需要在项目中添加 Spire.Doc 依赖。

2.1 引入 Spire.Doc 依赖

在你的项目中,可以通过 Maven 引入 Spire.Doc,如下所示:

<dependency>  <groupId>e-iceblue</groupId>  <artifactId>spire.doc.free</artifactId>  <version>5.2.0</version>  
</dependency>

2.2 禁用 SSL 证书验证

在处理一些需要 HTTPS 连接的 HTML 内容时,可能会遇到 SSL 证书验证问题。为了避免这些问题,可以临时禁用 SSL 验证。下面是一个实现示例:

public static void disableSSLVerification() {  try {  TrustManager[] trustAllCerts = new TrustManager[]{  new X509TrustManager() {  public X509Certificate[] getAcceptedIssuers() {  return null;  }  public void checkClientTrusted(X509Certificate[] certs, String authType) {  }  public void checkServerTrusted(X509Certificate[] certs, String authType) {  }  }  };  SSLContext sc = SSLContext.getInstance("SSL");  sc.init(null, trustAllCerts, new java.security.SecureRandom());  HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());  HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true);  } catch (Exception e) {  e.printStackTrace();  }  
}

3. 实现功能

接下来,我们将实现一个完整的 Java 类,通过读取 HTML 文件,将其转换为 PDF。在这个过程中,我们将重点介绍文件读取、HTML 内容处理和 PDF 文件生成的步骤。

3.1 主类结构

以下是我们的主类 DocToPdfConverter 的结构,这里包含了所有必要的方法:

package com.dahua.saas.illegalpunish.controller;  import com.spire.doc.Document;  
import com.spire.doc.FileFormat;  
import com.spire.doc.Section;  import javax.net.ssl.*;  
import java.security.cert.X509Certificate;  
import java.io.BufferedReader;  
import java.io.FileReader;  
import java.io.IOException;  
import java.io.InputStream;  
import java.net.HttpURLConnection;  
import java.net.URL;  
import java.util.regex.Matcher;  
import java.util.regex.Pattern;  public class DocToPdfConverter {  public static void main(String[] args) throws IOException {  disableSSLVerification();  String inputHtml = "C:\\cloud\\dahua\\VIASBIllegalPunish\\file\\1912202400018.doc";  Document doc = new Document();  Section sec = doc.addSection();  String htmlText = readTextFromFile(inputHtml);  sec.addParagraph().appendHTML(replaceImagesWithHighRes(htmlText));  doc.saveToFile("C:\\cloud\\dahua\\VIASBIllegalPunish\\file\\1912202400018.pdf", FileFormat.PDF);  doc.dispose();  }  // 读取文本文件内容  public static String readTextFromFile(String fileName) throws IOException {  StringBuilder sb = new StringBuilder();  BufferedReader br = new BufferedReader(new FileReader(fileName));  String content;  while ((content = br.readLine()) != null) {  sb.append(content);  sb.append(System.lineSeparator());  }  return sb.toString();  }  // 替换 HTML 文本中的图片链接为高分辨率图像  public static String replaceImagesWithHighRes(String html) {  String imageUrlPattern = "https?://[^\\s\"'<>]+";  Pattern pattern = Pattern.compile(imageUrlPattern);  Matcher matcher = pattern.matcher(html);  StringBuffer resultHtml = new StringBuffer();  while (matcher.find()) {  String imageUrl = matcher.group();  String highResImage = downloadImage(imageUrl);  matcher.appendReplacement(resultHtml, highResImage);  }  matcher.appendTail(resultHtml);  return resultHtml.toString();   }  // 下载图片,返回高分辨率的图像数据  public static String downloadImage(String imageUrl) {  try {  URL url = new URL(imageUrl);  HttpURLConnection connection = (HttpURLConnection) url.openConnection();  connection.setDoInput(true);  connection.connect();  InputStream input = connection.getInputStream();  // 这里可以实现将输入流转换为适合插入 PDF 的格式  return imageUrl; // 现在只是返回原始 URL  } catch (IOException e) {  e.printStackTrace();  return imageUrl;   }  }  
}

3.2 代码解析

  • 禁用 SSL 验证:通过调用 disableSSLVerification() 方法来忽略 SSL 证书验证,以便可以访问 HTTP 和 HTTPS 内容。

  • 读取 HTML 文件:使用 readTextFromFile() 方法读取指定路径下的 HTML 文件。这个方法使用 BufferedReader 逐行读取,最终返回一个完整的 HTML 内容字符串。

  • 处理图片链接:在 replaceImagesWithHighRes() 方法中,首先通过正则表达式查找所有的图片链接,然后下载高分辨率的图片。在这里,具体的下载逻辑需要根据实际情况实现,例如可以选择将图像转换为 Base64 格式,并替换 HTML 内容中的 src 属性以达到嵌入图像的效果。

  • 生成 PDF:使用 Spire.Doc 库创建一个新的 Document 对象,并添加一个 Section,然后通过 appendHTML() 方法将处理后的 HTML 内容添加到文档中。最后,调用 saveToFile() 方法将文档保存为 PDF 格式的文件。

4. 处理图像

在本示例中,downloadImage 方法返回的是原始的图像 URL。在实际应用中,您可能需要将下载的图片以适当的格式嵌入 PDF,例如将其转换为 Base64 字符串。下面是一个简单的实现示例:

public static String downloadImage(String imageUrl) {  try {  URL url = new URL(imageUrl);  HttpURLConnection connection = (HttpURLConnection) url.openConnection();  connection.setDoInput(true);  connection.connect();  InputStream input = connection.getInputStream();  // Convert InputStream to byte array  byte[] imageBytes = input.readAllBytes();  String base64Image = Base64.getEncoder().encodeToString(imageBytes);  return "data:image/png;base64," + base64Image; // Assuming image is PNG  } catch (IOException e) {  e.printStackTrace();  return imageUrl;   }  
}

5. 性能优化

在处理大量图像时,批量处理或异步下载可以显著提高程序的性能和响应速度。以下是一些优化建议和具体实现策略。

5.1 异步下载图像

使用 Java 的并发 API,可以实现异步下载图像。这意味着在处理 HTML 的同时,可以在后台下载图像,不阻塞主线程。

示例代码

使用 CompletableFuture 来实现异步下载图像的能力:

import java.util.concurrent.CompletableFuture;  public static CompletableFuture<String> downloadImageAsync(String imageUrl) {  return CompletableFuture.supplyAsync(() -> {  try {  URL url = new URL(imageUrl);  HttpURLConnection connection = (HttpURLConnection) url.openConnection();  connection.setDoInput(true);  connection.connect();  InputStream input = connection.getInputStream();  byte[] imageBytes = input.readAllBytes();  String base64Image = Base64.getEncoder().encodeToString(imageBytes);  return "data:image/png;base64," + base64Image; // 假设图像为 PNG  } catch (IOException e) {  e.printStackTrace();  return imageUrl;   }  });  
}

然后在 replaceImagesWithHighRes() 方法中,使用 Java 的流处理来启动异步下载:

public static String replaceImagesWithHighRes(String html) {  String imageUrlPattern = "https?://[^\\s\"'<>]+";  Pattern pattern = Pattern.compile(imageUrlPattern);  Matcher matcher = pattern.matcher(html);  List<CompletableFuture<String>> futures = new ArrayList<>();  StringBuffer resultHtml = new StringBuffer();  while (matcher.find()) {  String imageUrl = matcher.group();  CompletableFuture<String> future = downloadImageAsync(imageUrl);  futures.add(future);  matcher.appendReplacement(resultHtml, ""); // 先将占位符放入结果 HTML  }  matcher.appendTail(resultHtml);  // 等待所有图像下载完成  CompletableFuture<Void> allOf = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));  allOf.join();  // 等待所有 CompletableFuture 完成  // 用下载后的图像替换  for (int i = 0; i < futures.size(); i++) {  try {  String downloadedImage = futures.get(i).get(); // 获取下载过的图像  String placeholder = ""; // 这里可以根据需要生成占位符  // 将占位符替换为实际的图像  resultHtml = new StringBuffer(resultHtml.toString().replaceFirst(Pattern.quote(placeholder), downloadedImage));   } catch (Exception e) {  e.printStackTrace();  }  }  return resultHtml.toString();   
}

通过以上方式,您可以实现图像的异步下载,从而提升程序的性能,特别是在处理大量数据时。

5.2 批量处理优化

如果 HTML 文件中包含大量的图像,您还可以采取以下措施进行批量处理:

  • 限制并发量:在实际运行中,尤其是在网络条件不确定的情况下,限制并发请求的数量可以避免请求过载和资源竞争。可以使用 Java 的信号灯(Semaphore)来控制并发。
示例代码
import java.util.concurrent.Semaphore;  private static final Semaphore semaphore = new Semaphore(5); // 最多允许 5 个并发下载  public static CompletableFuture<String> downloadImageAsync(String imageUrl) {  return CompletableFuture.supplyAsync(() -> {  try {  semaphore.acquire(); // 获取信号量  try {  // 文章前面提到的下载逻辑  URL url = new URL(imageUrl);  HttpURLConnection connection = (HttpURLConnection) url.openConnection();  connection.setDoInput(true);  connection.connect();  InputStream input = connection.getInputStream();  byte[] imageBytes = input.readAllBytes();  String base64Image = Base64.getEncoder().encodeToString(imageBytes);  return "data:image/png;base64," + base64Image;  } finally {  semaphore.release(); // 释放信号量  }  } catch (IOException e) {  e.printStackTrace();  return imageUrl;   }  });  
}

通过这种方式,您可以控制并发量,从而降低服务器负载和提高下载成功率。

6. 错误处理与日志管理

在处理网络请求和文件操作时,错误处理至关重要。应确保在项目中实现有效的日志记录和错误处理机制。

6.1 错误处理

确保任何网络请求、文件读取和转换操作都能妥善处理异常情况。以下是一些建议:

  • 捕获并记录异常:应在每个网络请求和文件操作中捕获异常并记录详细信息,以便后期调试。
  • 使用重试机制:对于短暂的网络问题,可以使用重试逻辑重新尝试下载图像。
示例代码
public static String downloadImageWithRetry(String imageUrl, int retryCount) {  for (int i = 0; i < retryCount; i++) {  try {  return downloadImage(imageUrl); // 使用之前定义的下载逻辑  } catch (IOException e) {  if (i == retryCount - 1) {  e.printStackTrace(); // 记录最终失败的情况  }  }  }  return imageUrl; // 默认返回原始的 URL  
}

6.2 日志管理

可以使用日志框架(如 SLF4J、Log4j)来进行日志管理。将日志记录在适当的级别(例如 INFO、WARN、ERROR),可以帮助开发人员在出现问题时快速定位。

示例代码
import org.slf4j.Logger;  
import org.slf4j.LoggerFactory;  public class DocToPdfConverter {  private static final Logger logger = LoggerFactory.getLogger(DocToPdfConverter.class);  public static void main(String[] args) {  try {  // 主逻辑  } catch (Exception e) {  logger.error("Error occurred during PDF conversion", e);  }  }  
}

7. 总结

本文介绍了如何使用 Spire.Doc 将 HTML 文件转换为 PDF 的详细过程。我们探讨了图像处理方法,包括同步和异步下载,并提供了实用的性能优化建议。此外,我们还强调了错误处理和日志管理的重要性,以增强代码的健壮性。

应用这些技术,您将能够高效地处理 HTML 文档,转化为高质量的 PDF 格式,满足现代软件开发中的各种需求。如需进一步信息或帮助,欢迎随时联系我解答您的疑问。希望本文能够为您的开发工作提供实用的参考和指导!

相关文章:

将HTML转换为PDF:使用Spire.Doc的详细指南(一) 试用版

目录 引言 1. 为什么选择 Spire.Doc&#xff1f; 1.1 主要特点 1.2 适用场景 2. 准备工作 2.1 引入 Spire.Doc 依赖 2.2 禁用 SSL 证书验证 3. 实现功能 3.1 主类结构 3.2 代码解析 4. 处理图像 5. 性能优化 5.1 异步下载图像 示例代码 5.2 批量处理优化 示例代…...

数据结构经典算法总复习(下卷)

第五章:树和二叉树 先序遍历二叉树的非递归算法。 void PreOrderTraverse(BiTree T, void (*Visit)(TElemType)) {//表示用于查找的函数的指针Stack S; BiTree p T;InitStack(S);//S模拟工作栈while (p || !StackEmpty(S)) {//S为空且下一个结点为空&#xff0c;意味着结束遍…...

mac 安装graalvm

Download GraalVM 上面链接选择jdk的版本 以及系统的环境下载graalvm的tar包 解压tar包 tar -xzf graalvm-jdk-<version>_macos-<architecture>.tar.gz 移入java的文件夹目录 sudo mv graalvm-jdk-<version> /Library/Java/JavaVirtualMachines 设置环境变…...

【SH】在Ubuntu Server 24中基于Python Web应用的Flask Web开发(实现POST请求)学习笔记

文章目录 Flask开发环境搭建保持Flask运行Debug调试 路由和视图可变路由 请求和响应获取请求信息Request属性响应状态码常见状态码CookieSession 表单GET请求POST请求 Flask 在用户使用浏览器访问网页的过程中&#xff0c;浏览器首先会发送一个请求到服务器&#xff0c;服务器…...

一些经济政治学类书籍推荐 --- 以及与之相关我的经历和理解

我给所开设的兴趣专栏_墨#≯的博客-CSDN博客&#xff0c;的介绍是&#xff1a; 聊聊关于文学、经济(股票等)、法律方面的个人感受与理解。 不过目前已有的两篇以及现在在写的这篇都是经济相关的&#xff0c;其实专栏开设的9月至今&#xff0c;我也看了好几本文学相关的书&#…...

设计模式之 abstract factory

适用场景 一个系统要独立于它的产品的创建、组合和表示时。一个系统要由多个产品系列中的一个来配置时。当你要强调一系列相关的产品对象的设计以便进行联合使用时。当你提供一个产品类库&#xff0c;而只想显示它们的接口而不是实现时 架构演示 首先client这个东西可以接触到…...

汽车IVI中控开发入门及进阶(三十八):手机投屏HiCar开发

手机投屏轻松实现手机与汽车的无缝连接,导航、音乐、通话等功能应有尽有,还支持更多第三方应用,让车载互联生活更加丰富多彩。 HiCar在兼容性和开放性上更具优势。 手机投屏可以说是车机的杀手级应用,大大拓宽了车机的可用性范围。其中华为推出的HiCar就是非常好用的一种。…...

Springmvc,spring ,mybatis,整合,ssm

上一章内容&#xff1a; 1.spring框架:作用 开源的框架--提供IOC和AOPIOC控制反转 把创建对象的权力交于spring创建&#xff0c;并管理对象的生命周期&#xff0c;通过DI完成对象属性的注入。 ​ 2. spring配置中<bean>也可以使用注解Component Controller Service Repo…...

《庐山派从入门到...》板载按键启动!

《庐山派从入门到...》板载按键启动&#xff01; 《庐山派从入门到...》板载按键启动&#xff01; 视频内容大致如下 我们之前了解了GPIO的输出模式使用方法&#xff0c;并且成功点灯&#xff0c;很明显本篇要来分享的自然是GPIO的输入模式 正好回顾一下之前学的python基础包…...

Mapbox-GL 中 `token` 的使用

Mapbox-GL 是一个开源的 JavaScript 库&#xff0c;允许开发者在网页上渲染交互式地图。token 在 Mapbox 中主要是指 access token&#xff0c;它用于身份验证和授权&#xff0c;确保应用程序能够访问 Mapbox 的地图服务。 下面详细解析 Mapbox GL 中 token 的使用&#xff0c…...

Flutter组件————PageView

PageView 可以创建滑动页面效果的widget&#xff0c;它允许用户通过水平或垂直滑动手势在多个子页面&#xff08;child widgets&#xff09;之间切换。每个子页面通常占据屏幕的全部空间。 参数 参数名类型描述childrenList<Widget>包含在 PageView 中的所有子部件&am…...

c#自定义事件

自定义事件类 定义一个自定义事件参数类 为了传递更多的信息&#xff0c;我们定义一个自定义的事件参数类 public class CustomEventArgs : EventArgs {public string Message { get; set; } } 3. 定义一个发布者类 接下来&#xff0c;我们定义一个发布者类&#xff0c;包含…...

【读书笔记】《论语别裁》寂寞的享受

1.内容摘要 在《论语别裁》中&#xff0c;第一章《学而》探讨了做学问的孤独与坚持。作者强调&#xff0c;真正的学者在追求知识时&#xff0c;必须保持“仁”与“义”的核心价值观&#xff0c;愿意为自己的信念与理想而牺牲。他以孔子为例&#xff0c;描绘了孔子一生的寂寞与…...

Oracle筑基篇-调度算法-LRU的引入

常见的调度算法 图1 调度算法思维导图 一、LRU算法的典型使用场景 1. 操作系统中的页面置换 什么时候用到页面置换算法呢&#xff1f; 当CPU发出指令需要访问某个地址时&#xff0c;若该地址在TLB&#xff08;Translation Lookaside Buffer&#xff0c;快表&#xff09;或页…...

单元测试-Unittest框架实践

文章目录 1.Unittest简介1.1 自动化测试用例编写步骤1.2 相关概念1.3 用例编写规则1.4 断言方法 2.示例2.1 业务代码2.2 编写测试用例2.3 生成报告2.3.1 方法12.3.2 方法2 1.Unittest简介 Unittest是Python自带的单元测试框架&#xff0c;适用于&#xff1a;单元测试、Web自动…...

linux驱动:6ull(3)自动分配设备号来创建led驱动

在 linux驱动&#xff1a;6ull&#xff08;2&#xff09;的文章代码上进行更改 步骤&#xff1a; 创建入口函数和出口函数定义一个设备结构体和创建一个led设备在入口函数init中添加初始化led的gpio在入口函数init中添加自动分配设备号来创建led字符设备在出口函数中取消led的…...

GM_T 0039《密码模块安全检测要求》题目

单项选择题 根据GM/T 0039《密码模块安全检测要求》,送检单位的密码模块应包括()密码主管角色。 A.一个 B.两个 C.至少一个 D.至少两个 正确答案:C 多项选择题 根据GM/T 0039《密码模块安全检测要求》,关于非入侵式安全,以下属于安全三级密码模块要求的是()。 …...

第四届电气工程与控制科学

重要信息 官网&#xff1a;www.ic2ecs.com 时间&#xff1a;2024年12月27-29日 简介 第四届电气工程与控制科学定于2024年12月27-29日在中国南京召开。主要围绕“电气工程“、”控制科学“、”机械工程“、”自动化”等主题展开&#xff0c;旨在为从电…...

LabVIEW在电液比例控制与伺服控制中的应用

LabVIEW作为一种图形化编程环境&#xff0c;广泛应用于各类控制系统中&#xff0c;包括电液比例控制和伺服控制领域。在这些高精度、高动态要求的控制系统中&#xff0c;LabVIEW的优势尤为突出。以下从多个角度探讨其应用与优势&#xff1a; ​ 1. 灵活的控制架构 LabVIEW为电…...

植物大战僵尸杂交版v3.0.2最新版本(附下载链接)

B站游戏作者潜艇伟伟迷于12月21日更新了植物大战僵尸杂交版3.0.2版本&#xff01;&#xff01;&#xff01;&#xff0c;有b站账户的记得要给作者三连关注一下呀&#xff01; 不多废话下载链接放上&#xff1a; 夸克网盘链接&#xff1a;&#xff1a;https://pan.quark.cn/s/5c…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...