Java开发提效秘籍:巧用Apache Commons IO工具库

一、引言

在 Java 开发的广袤领域中,输入输出(I/O)操作宛如一座桥梁,连接着程序与外部世界,从文件的读取与写入,到网络数据的传输,I/O 操作无处不在,其重要性不言而喻。然而,传统的 Java I/O 操作犹如手工打造一件复杂的工艺品,代码繁琐且易错,开发人员往往需要花费大量的时间与精力在这些基础操作上,严重影响了开发效率。

想象一下,在开发一个文件管理系统时,若采用原生 Java I/O,从文件的复制、移动到目录的递归遍历,每一步都需要精心编写大量代码,稍有不慎就可能引入难以排查的漏洞。此时,Apache Commons IO 工具库应运而生,它宛如一位经验丰富的工匠,为开发人员提供了一系列高效、便捷的工具,将复杂的 I/O 操作简化为简单的方法调用,大幅提升开发效率,让开发人员能够将更多的精力投入到核心业务逻辑的实现中。

二、Apache Commons IO 工具库简介

(一)工具库概述

Apache Commons IO 是 Apache 软件基金会旗下的一个开源项目,致力于为 Java 开发者提供一套全面且强大的工具集,专门用于处理 Java 中的输入输出功能。其诞生旨在解决 Java 原生 I/O 操作的复杂性和繁琐性,让开发者能够更加便捷、高效地进行文件和流的处理。

该工具库涵盖了文件操作、流处理、文件过滤、字节转换等多个领域,几乎囊括了 Java I/O 编程中可能涉及的所有场景。无论是简单的文件读取与写入,还是复杂的目录递归操作、网络流的管理,Apache Commons IO 都提供了相应的类和方法,极大地拓展了 Java 原生 I/O 的功能边界。

(二)优势亮点

  1. 功能丰富:提供了丰富多样的功能,涵盖文件操作的方方面面,如文件的创建、删除、复制、移动、重命名,目录的遍历、创建多级目录等,以及各种流的处理,包括字节流、字符流的读取、写入、转换等。
  2. 代码简洁:通过封装复杂的 I/O 操作逻辑,将其简化为简单的方法调用。例如,使用 FileUtils 类的 copyFile 方法,只需一行代码即可完成文件的复制,无需像原生 I/O 那样编写大量的流操作代码 。
  3. 提高开发效率:大大减少了开发者在 I/O 操作上花费的时间和精力,使开发者能够将更多的注意力集中在核心业务逻辑的实现上,从而显著提高整个项目的开发进度。
  4. 增强代码可读性:简洁明了的方法命名和调用方式,使得代码的意图一目了然。例如,使用 IOUtils 的 closeQuietly 方法关闭流,从方法名就能清晰知道其功能,增强了代码的可维护性。
  5. 性能优化:内部实现经过精心设计和优化,在处理大量数据或复杂 I/O 操作时,能够提供高效的性能表现,减少资源消耗和执行时间。
  6. 兼容性好:支持多种 Java 版本,具有良好的跨平台性,能够在不同的操作系统和 Java 环境中稳定运行,保证了项目的兼容性和可移植性。

三、核心功能与使用方法

(一)文件操作

1. 文件拷贝

在 Apache Commons IO 中,使用FileUtils.copyFile方法可轻松实现文件拷贝。例如,将source.txt文件拷贝到target.txt,代码如下:

import org.apache.commons.io.FileUtils;import java.io.File;import java.io.IOException;public class FileCopyExample {public static void main(String[] args) {File source = new File("source.txt");File target = new File("target.txt");try {FileUtils.copyFile(source, target);System.out.println("文件拷贝成功!");} catch (IOException e) {e.printStackTrace();}}}

此方法接受两个参数,源文件和目标文件路径。若目标文件已存在,其内容将被源文件覆盖。

2. 文件删除

FileUtils.forceDelete方法能强制删除文件,即使文件处于只读状态或不存在也能处理。示例如下:

import org.apache.commons.io.FileUtils;import java.io.File;import java.io.IOException;public class FileDeleteExample {public static void main(String[] args) {File fileToDelete = new File("toBeDeleted.txt");try {FileUtils.forceDelete(fileToDelete);System.out.println("文件已删除");} catch (IOException e) {e.printStackTrace();}}}

常用于清理临时文件或删除不再需要的配置文件。使用时需谨慎,因为文件一旦删除,难以恢复。

3. 文件读取与写入

读取文件内容可使用FileUtils.readFileToString方法,将文件内容读取为字符串。如读取content.txt文件内容:

import org.apache.commons.io.FileUtils;import java.io.File;import java.io.IOException;public class FileReadExample {public static void main(String[] args) {File file = new File("content.txt");try {String content = FileUtils.readFileToString(file, "UTF-8");System.out.println("文件内容:\n" + content);} catch (IOException e) {e.printStackTrace();}}}

写入文件则可使用FileUtils.writeStringToFile方法,将字符串写入文件。若文件不存在,会自动创建。例如,将字符串写入newFile.txt

import org.apache.commons.io.FileUtils;import java.io.File;import java.io.IOException;public class FileWriteExample {public static void main(String[] args) {File file = new File("newFile.txt");String content = "这是要写入文件的内容";try {FileUtils.writeStringToFile(file, content, "UTF-8");System.out.println("内容已写入文件");} catch (IOException e) {e.printStackTrace();}}}

这两个方法简化了文件读写操作,提高了开发效率。

(二)流操作

1. 流的拷贝

在处理流时,IOUtils.copy方法可实现从输入流到输出流的内容复制。例如,将一个文件输入流的内容复制到文件输出流,代码如下:

import org.apache.commons.io.IOUtils;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;public class StreamCopyExample {public static void main(String[] args) {try (FileInputStream fis = new FileInputStream("input.txt");FileOutputStream fos = new FileOutputStream("output.txt")) {IOUtils.copy(fis, fos);System.out.println("流拷贝完成");} catch (IOException e) {e.printStackTrace();}}}

该方法能高效处理各种类型的输入输出流,如文件流、网络流等。

2. 流的关闭

在 Java 中,正确关闭流资源至关重要。IOUtils.closeQuietly方法可忽略异常关闭流,确保资源正确释放。例如关闭一个输入流:

import org.apache.commons.io.IOUtils;import java.io.FileInputStream;import java.io.IOException;public class StreamCloseExample {public static void main(String[] args) {FileInputStream fis = null;try {fis = new FileInputStream("example.txt");// 处理流} catch (IOException e) {e.printStackTrace();} finally {IOUtils.closeQuietly(fis);}}}

即使在关闭流时发生异常,closeQuietly方法也不会抛出异常,避免了因异常处理不当导致的资源泄漏问题。

(三)文件名操作

1. 获取文件扩展名

通过FilenameUtils.getExtension方法可从文件名中获取扩展名。示例如下:

import org.apache.commons.io.FilenameUtils;public class FileExtensionExample {public static void main(String[] args) {String fileName = "document.pdf";String extension = FilenameUtils.getExtension(fileName);System.out.println("文件扩展名:" + extension);}}

运行结果将输出pdf,此方法在文件类型判断和处理时非常实用。

2. 获取文件名(不包含路径和扩展名)

使用FilenameUtils.getBaseName方法可提取文件名,不包含路径和扩展名。例如:

import org.apache.commons.io.FilenameUtils;public class FileNameExample {public static void main(String[] args) {String filePath = "/home/user/documents/report.docx";String baseName = FilenameUtils.getBaseName(filePath);System.out.println("文件名(不包含路径和扩展名):" + baseName);}}

输出结果为report,方便对文件名进行处理和展示。

3. 获取文件路径

FilenameUtils.getFullPath方法可获取文件的完整路径。代码示例如下:

import org.apache.commons.io.FilenameUtils;public class FilePathExample {public static void main(String[] args) {String filePath = "C:/projects/src/main/java/com/example/FileUtils.java";String fullPath = FilenameUtils.getFullPath(filePath);System.out.println("文件完整路径:" + fullPath);}}

输出结果为C:/projects/src/main/java/com/example/,在文件查找和定位场景中很有用。

(四)文件过滤

1. 创建文件过滤器

在 Apache Commons IO 中,可通过FileFilter接口创建文件过滤器。例如,创建一个按文件后缀名过滤的过滤器,代码如下:

import org.apache.commons.io.filefilter.SuffixFileFilter;import java.io.File;import java.io.FileFilter;public class FileFilterExample {public static void main(String[] args) {FileFilter filter = new SuffixFileFilter(".txt");File directory = new File("C:/documents");File[] files = directory.listFiles(filter);if (files!= null) {for (File file : files) {System.out.println(file.getName());}}}}

上述代码创建了一个只接受.txt后缀文件的过滤器,并列出指定目录下符合条件的文件。

2. 筛选文件

结合FileUtils.listFiles和自定义文件过滤器,可筛选出符合条件的文件。例如,筛选出指定目录下所有.java文件:

import org.apache.commons.io.FileUtils;import org.apache.commons.io.filefilter.SuffixFileFilter;import java.io.File;import java.io.FileFilter;import java.util.Collection;public class FileFilterAndListExample {public static void main(String[] args) {FileFilter filter = new SuffixFileFilter(".java");File directory = new File("C:/projects/src/main/java/com/example");Collection<File> files = FileUtils.listFiles(directory, filter, null);for (File file : files) {System.out.println(file.getName());}}}

FileUtils.listFiles方法会递归列出目录下所有符合过滤器条件的文件,方便进行批量处理。

(五)文件监控

1. 监听文件变化

FileAlterationMonitor类可创建文件和目录的监控功能,通过设置轮询间隔时间,定期检查文件系统的变化。示例如下:

import org.apache.commons.io.monitor.FileAlterationMonitor;import org.apache.commons.io.monitor.FileAlterationObserver;import java.io.File;import java.io.IOException;public class FileMonitorExample {public static void main(String[] args) throws Exception {File directory = new File("C:/monitoredDirectory");FileAlterationObserver observer = new FileAlterationObserver(directory);FileAlterationMonitor monitor = new FileAlterationMonitor(5000, observer);monitor.start();// 保持程序运行,否则监控将停止Thread.sleep(60000);monitor.stop();}}

上述代码设置了每 5 秒检查一次指定目录下的文件变化。

2. 实现文件变化处理

要实现对文件创建、删除、修改等变化的处理,可通过实现FileAlterationListener接口来完成。例如:

import org.apache.commons.io.monitor.FileAlterationListener;import org.apache.commons.io.monitor.FileAlterationObserver;import org.apache.commons.io.monitor.FileAlterationMonitor;import java.io.File;import java.io.IOException;public class FileChangeListener implements FileAlterationListener {@Overridepublic void onStart(FileAlterationObserver observer) {System.out.println("文件监控开始");}@Overridepublic void onDirectoryCreate(File directory) {System.out.println("新目录创建:" + directory.getAbsolutePath());}@Overridepublic void onDirectoryChange(File directory) {System.out.println("目录变更:" + directory.getAbsolutePath());}@Overridepublic void onDirectoryDelete(File directory) {System.out.println("目录删除:" + directory.getAbsolutePath());}@Overridepublic void onFileCreate(File file) {System.out.println("新文件创建:" + file.getAbsolutePath());}@Overridepublic void onFileChange(File file) {System.out.println("文件变更:" + file.getAbsolutePath());}@Overridepublic void onFileDelete(File file) {System.out.println("文件删除:" + file.getAbsolutePath());}@Overridepublic void onStop(FileAlterationObserver observer) {System.out.println("文件监控停止");}public static void main(String[] args) throws Exception {File directory = new File("C:/monitoredDirectory");FileAlterationObserver observer = new FileAlterationObserver(directory);observer.addListener(new FileChangeListener());FileAlterationMonitor monitor = new FileAlterationMonitor(5000, observer);monitor.start();Thread.sleep(60000);monitor.stop();}}

通过实现FileAlterationListener接口的各个方法,可对文件系统的各种变化做出相应处理,满足业务需求。

四、实际应用案例

(一)文件上传功能实现

在 Web 应用开发中,文件上传是常见功能。借助 Apache Commons IO 库和 Commons FileUpload 库,可轻松实现。以一个简单的 Spring Boot 项目为例,首先需在pom.xml文件中添加依赖:

<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-io</artifactId><version>2.11.0</version></dependency>

接着创建一个控制器方法处理文件上传请求:

import org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;import java.io.File;import java.util.List;@RestController@RequestMapping("/upload")public class FileUploadController {@PostMappingpublic String uploadFile(HttpServletRequest request) {try {boolean isMultipart = ServletFileUpload.isMultipartContent(request);if (isMultipart) {DiskFileItemFactory factory = new DiskFileItemFactory();ServletFileUpload upload = new ServletFileUpload(factory);List<FileItem> items = upload.parseRequest(request);for (FileItem item : items) {if (!item.isFormField()) {String filePath = request.getServletContext().getRealPath("") + File.separator + item.getName();File file = new File(filePath);item.write(file);}}return "文件上传成功";} else {return "请求不是多部分内容";}} catch (Exception e) {e.printStackTrace();return "文件上传失败";}}}

上述代码中,ServletFileUpload用于解析文件上传请求,FileItem代表上传的文件项,通过Apache Commons IO库中的File类将文件保存到服务器指定路径。

(二)数据备份与恢复

在数据备份和恢复场景中,Apache Commons IO工具库的FileUtils类可实现文件和目录的批量拷贝与恢复。假设要对一个重要的数据库备份目录进行定期备份,代码如下:

import org.apache.commons.io.FileUtils;import java.io.File;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;public class DataBackup {public static void main(String[] args) {String sourceDir = "C:/data/database_backup";String targetDir = "C:/backup/database_backup_" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());try {FileUtils.copyDirectory(new File(sourceDir), new File(targetDir));System.out.println("数据备份成功");} catch (IOException e) {e.printStackTrace();System.out.println("数据备份失败");}}}

在恢复数据时,只需将备份目录中的文件或目录再拷贝回原位置即可。例如:

import org.apache.commons.io.FileUtils;import java.io.File;import java.io.IOException;public class DataRestore {public static void main(String[] args) {String backupDir = "C:/backup/database_backup_20241001120000";String targetDir = "C:/data/database_backup";try {FileUtils.copyDirectory(new File(backupDir), new File(targetDir));System.out.println("数据恢复成功");} catch (IOException e) {e.printStackTrace();System.out.println("数据恢复失败");}}}

通过这种方式,利用FileUtils.copyDirectory方法实现了高效的数据备份与恢复操作。

(三)日志文件处理

在日志文件处理场景中,Apache Commons IO工具库可用于日志文件的读取、分析和清理。例如,要读取一个日志文件并统计其中特定错误信息出现的次数,代码如下:

import org.apache.commons.io.FileUtils;import java.io.File;import java.io.IOException;import java.util.List;public class LogAnalysis {public static void main(String[] args) {String logFilePath = "C:/logs/application.log";try {List<String> lines = FileUtils.readLines(new File(logFilePath));int errorCount = 0;for (String line : lines) {if (line.contains("ERROR: Database connection failed")) {errorCount++;}}System.out.println("数据库连接失败错误出现次数: " + errorCount);} catch (IOException e) {e.printStackTrace();}}}

对于日志文件的清理,若要定期删除超过一定时间的日志文件,可结合FileUtils.forceDelete方法实现。例如,删除一周前的日志文件:

import org.apache.commons.io.FileUtils;import java.io.File;import java.util.Calendar;import java.util.Date;public class LogCleanup {public static void main(String[] args) {String logDir = "C:/logs";File dir = new File(logDir);File[] files = dir.listFiles();if (files!= null) {Calendar cal = Calendar.getInstance();cal.add(Calendar.DAY_OF_YEAR, -7);Date oneWeekAgo = cal.getTime();for (File file : files) {if (file.isFile() && file.lastModified() < oneWeekAgo.getTime()) {try {FileUtils.forceDelete(file);System.out.println("已删除过期日志文件: " + file.getName());} catch (IOException e) {e.printStackTrace();}}}}}}

通过这些实际案例,充分展示了Apache Commons IO工具库在不同场景下的强大功能和便捷性,能够有效提升 Java 开发中与 I/O 操作相关的业务处理效率 。

五、使用技巧与注意事项

(一)合理选择工具类与方法

在使用 Apache Commons IO 工具库时,需依据不同的 I/O 操作需求,精准挑选合适的工具类和方法。例如,若要对文件进行复制、删除、移动等常规操作,优先选用FileUtils类;若涉及流的处理,如流的拷贝、关闭等,则使用IOUtils类。

在处理大文件时,避免使用一次性读取整个文件内容的方法,防止内存溢出。可采用FileUtils.readLines方法按行读取文件,或使用IOUtils.copyLarge方法进行流的拷贝,以提高处理效率和稳定性。

(二)注意资源管理与异常处理

在使用工具库时,资源的正确关闭和异常处理至关重要。虽然IOUtils.closeQuietly方法能忽略异常关闭流,但在某些场景下,可能需要更精细的异常处理逻辑,以确保程序的健壮性。

在进行文件操作时,要考虑文件不存在、权限不足等异常情况。例如,在使用FileUtils.forceDelete方法删除文件时,若文件无法删除,应捕获IOException异常,并进行相应的错误处理,如记录日志或向用户提示错误信息。

(三)性能优化建议

为提升文件操作和流处理的性能,可采取以下优化措施:

  1. 批量操作:在进行文件拷贝或删除等操作时,若涉及多个文件,尽量使用批量操作方法。如FileUtils.copyDirectory方法可一次性递归拷贝整个目录及其所有内容,避免逐个文件操作带来的性能开销。
  2. 缓冲处理:对于流的操作,可使用IOUtils.buffer方法将输入流或输出流包装成带有缓冲功能的流,减少对底层资源(如磁盘)的频繁访问,从而提高整体的执行效率。尤其在处理大量数据时,缓冲处理能显著提升性能。
  3. 减少不必要的操作:在编写代码时,仔细分析业务需求,避免进行不必要的文件读取、写入或流操作。例如,在对文件内容进行处理时,尽量在一次读取后完成所有必要的计算和转换,避免多次重复读取文件。

六、总结与展望

Apache Commons IO 工具库作为 Java 开发中的得力助手,以其丰富的功能、简洁的代码实现和出色的性能优化,显著提升了开发人员在 I/O 操作方面的效率和质量。通过对文件操作、流操作、文件名处理、文件过滤以及文件监控等核心功能的深入学习和实际应用,我们见证了其在各类 Java 项目中的强大适用性和价值。

在未来的 Java 开发中,随着技术的不断演进和应用场景的日益复杂,对高效 I/O 处理的需求将持续增长。Apache Commons IO 工具库有望进一步拓展其功能边界,例如在大数据处理场景下,优化对海量文件的读写和管理能力;在分布式系统中,增强对跨网络节点的文件操作支持。同时,工具库的开发者也将不断提升其性能和稳定性,以适应不断变化的技术环境和开发需求。

对于广大 Java 开发者而言,深入学习和熟练掌握 Apache Commons IO 工具库,不仅能够提升个人的开发技能和效率,还能为项目的成功实施提供有力保障。希望本文能激发大家对该工具库的探索热情,在实际开发中充分发挥其优势,创造出更加高效、稳定的 Java 应用程序 。

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

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

相关文章

算法刷题笔记——图论篇

这里写目录标题 理论基础图的基本概念图的种类度 连通性连通图强连通图连通分量强连通分量 图的构造邻接矩阵邻接表 图的遍历方式 深度优先搜索理论基础dfs 与 bfs 区别dfs 搜索过程深搜三部曲所有可达路径广度优先搜索理论基础广搜的使用场景广搜的过程 岛屿数量孤岛的总面积沉…

利用免费GIS工具箱实现高斯泼溅切片,将 PLY 格式转换为 3dtiles

在地理信息系统&#xff08;GIS&#xff09;和三维数据处理领域&#xff0c;不同数据格式有其独特应用场景与优势。PLY&#xff08;Polygon File Format&#xff09;格式常用于存储多边形网格数据&#xff0c;而 3DTiles 格式在 Web 端三维场景展示等方面表现出色。将 PLY 格式…

【数据分析】02- A/B 测试:玩转假设检验、t 检验与卡方检验

一、背景&#xff1a;当“审判”成为科学 1.1 虚拟场景——法庭审判 想象这样一个场景&#xff1a;有一天&#xff0c;你在王国里担任“首席审判官”。你面前站着一位嫌疑人&#xff0c;有人指控他说“偷了国王珍贵的金冠”。但究竟是他干的&#xff0c;还是他是被冤枉的&…

Spark任务提交流程

当包含在application master中的spark-driver启动后&#xff0c;会与资源调度平台交互获取其他执行器资源&#xff0c;并通过反向注册通知对应的node节点启动执行容器。此外&#xff0c;还会根据程序的执行规划生成两个非常重要的东西&#xff0c;一个是根据spark任务执行计划生…

54,【4】BUUCTF WEB GYCTF2020Ezsqli

进入靶场 吓我一跳&#xff0c;但凡放个彭于晏我都不说啥了 提交个1看看 1 and 11 1# 还尝试了很多&#xff0c;不过都被过滤了&#xff0c;头疼 看看别人的WP 竟然要写代码去跑&#xff01;&#xff01;&#xff01;&#xff0c;不会啊&#xff0c;先用别人的代码吧&#xf…

从零搭建一套远程手机的桌面操控和文件传输的小工具

从零搭建一套远程手机的桌面操控和文件传输的小工具 --ADB连接专题 一、前言 前面的篇章中&#xff0c;我们确定了通过基于TCP连接的ADB控制远程手机的操作思路。本篇中我们将进行实际的ADB桥接的具体链路搭建工作&#xff0c;从原理和实际部署和操作层面上&#xff0c;从零…

【深度学习实战】kaggle 自动驾驶的假场景分类

本次分享我在kaggle中参与竞赛的历程&#xff0c;这个版本是我的第一版&#xff0c;使用的是vgg。欢迎大家进行建议和交流。 概述 判断自动驾驶场景是真是假&#xff0c;训练神经网络或使用任何算法来分类驾驶场景的图像是真实的还是虚假的。 图像采用 RGB 格式并以 JPEG 格式…

如何使用MaskerLogger防止敏感数据发生泄露

关于MaskerLogger MaskerLogger是一款功能强大的记录工具&#xff0c;该工具可以有效防止敏感数据泄露的发生。 MaskerLogger旨在保护目标系统的日子安全&#xff0c;此格式化程序可确保你的日志安全并防止敏感数据泄露。例如使用此格式化程序&#xff0c;打印下列数据&#x…

【网络协议】RFC3164-The BSD syslog Protocol

引言 Syslog常被称为系统日志或系统记录&#xff0c;是一种标准化的协议&#xff0c;用于网络设备、服务器和应用程序向中央Syslog服务器发送日志消息。互联网工程任务组&#xff08;IETF&#xff09;发布的RFC 3164&#xff0c;专门定义了BSD Syslog协议的规范和实现方式。通…

oracle使用case when报错ORA-12704字符集不匹配原因分析及解决方法

问题概述 使用oracle的case when函数时&#xff0c;报错提示ORA-12704字符集不匹配&#xff0c;如下图&#xff0c;接下来分析报错原因并提出解决方法。 样例演示 现在有一个TESTTABLE表&#xff0c;本表包含的字段如下图所示&#xff0c;COL01字段是NVARCHAR2类型&#xff0…

springboot医院信管系统

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&a…

LabVIEW 实现线路板 PCB 可靠性测试

在电子设备制造领域&#xff0c;线路板 PCB&#xff08;Printed Circuit Board&#xff09;的可靠性直接影响产品的整体性能和使用寿命。企业在生产新型智能手机主板时&#xff0c;需要对 PCB 进行严格的可靠性测试&#xff0c;以确保产品在复杂环境下能稳定运行。传统的测试方…

【docker踩坑记录】

docker踩坑记录 踩坑记录(持续更新中.......)docker images 权限问题 踩坑记录(持续更新中…) docker images 权限问题 permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Head "http://%2Fvar%2Frun%2Fdocker.s…

【Redis 源码】压缩链表结构

压缩链表结构 文章目录 压缩链表结构1. ziplist 由来2. 组成3. ziplist对象3.1 ziplist对象创建3.2 创建一个空的ziplist3.3 创建对象3.4 字符编码指定 4. 总结 1. ziplist 由来 ​ 在说压缩链表前&#xff0c;我先拿数组和链表来做个引子&#xff0c;来更好理解为什么ziplist…

【Java数据结构】二叉树相关算法

第一题&#xff1a;获取二叉树中结点个数 得到二叉树结点个数&#xff0c;如果结点为空则返回0&#xff0c;然后再用递归计算左树结点个数根结点&#xff08;1个&#xff09;右树结点个数。 public int nodeSize(Node root){if (root null)return 0;return nodeSize1(root.l…

PCM5142集成32位384kHz PCM音频立体声114dB差分输出DAC编解码芯片

目录 PCM5142 简介PCM5142功能框图PCM5142特性 参考原理图 PCM5142 简介 PCM514x 属于单片 CMOS 集成电路系列&#xff0c;由立体声数模转换器 (DAC) 和采用薄型小外形尺寸 (TSSOP) 封装的附加支持电路组成。PCM514x 使用 TI 最新一代高级分段 DAC 架构产品&#xff0c;可实现…

debian中apt的配置与解析

引言 在系统使用过程中&#xff0c;我们可能会遭遇 apt update 操作出现问题&#xff0c;或者 apt upgrade 速度迟缓的情况。这往往是由于所使用软件源本身存在诸如服务器性能不佳、维护不及时等质量问题&#xff0c;同时&#xff0c;软件源服务器与我们所处地理位置的距离较远…

深度学习 Pytorch 张量的线性代数运算

pytorch中并未设置单独的矩阵对象类型&#xff0c;因此pytorch中&#xff0c;二维张量就相当于矩阵对象&#xff0c;并且拥有一系列线性代数相关函数和方法。 在实际机器学习和深度学习建模过程中&#xff0c;矩阵或者高维张量都是基本对象类型&#xff0c;而矩阵所涉及到的线…

ESP8266-01S、手机、STM32连接

1、ESP8266-01S的工作原理 1.1、AP和STA ESP8266-01S为WIFI的透传模块&#xff0c;主要模式如下图&#xff1a; 上节说到&#xff0c;我们需要用到AT固件进行局域网应用&#xff08;ESP8266连接的STM32和手机进行连接&#xff09;。 ESP8266为一个WiFi透传模块&#xff0c;和…

简历_基于 Cache Aside 模式解决数据库与缓存一致性问题。

系列博客目录 文章目录 系列博客目录缓存更新策略总结案例&#xff1a;给查询商铺的缓存添加超时剔除和主动更新的策略 说到解决数据库与缓存一致性的问题&#xff0c;其实就是要解决缓存更新的问题。 缓存更新策略 业务场景: 低一致性需求:使用内存淘汰机制。例如店铺类型的…