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

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 应用程序 。

相关文章:

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

一、引言 在 Java 开发的广袤领域中&#xff0c;输入输出&#xff08;I/O&#xff09;操作宛如一座桥梁&#xff0c;连接着程序与外部世界&#xff0c;从文件的读取与写入&#xff0c;到网络数据的传输&#xff0c;I/O 操作无处不在&#xff0c;其重要性不言而喻。然而&#xf…...

第1章:Python TDD基础与乘法功能测试

写在前面 这本书是我们老板推荐过的&#xff0c;我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后&#xff0c;我突然思考&#xff0c;对于测试开发工程师来说&#xff0c;什么才更有价值呢&#xff1f;如何让 AI 工具更好地辅助自己写代码&#xff0c;或许…...

web前端1--基础

&#xff08;时隔数月我又来写笔记啦~&#xff09; 1、下载vscode 1、官网下载&#xff1a;Visual Studio Code - Code Editing. Redefined 2、步骤&#xff1a; 1、点击同意 一直下一步 勾一个创建桌面快捷方式 在一直下一步 2、在桌面新建文件夹 拖到vscode图标上 打开v…...

.Net Core微服务入门全纪录(五)——Ocelot-API网关(下)

系列文章目录 1、.Net Core微服务入门系列&#xff08;一&#xff09;——项目搭建 2、.Net Core微服务入门全纪录&#xff08;二&#xff09;——Consul-服务注册与发现&#xff08;上&#xff09; 3、.Net Core微服务入门全纪录&#xff08;三&#xff09;——Consul-服务注…...

2024嵌入式系统的未来发展与技术洞察分享

时间如白驹过隙&#xff0c;不知不觉又是一年&#xff0c;这一年收获满满。接下来&#xff0c;将本年度对技术的感悟和洞察分析如下&#xff0c;希望对大家有所帮助。 在过去几十年里&#xff0c;嵌入式系统技术迅速发展&#xff0c;成为现代电子设备和智能硬件的核心组成部分。…...

python-44-嵌入式数据库SQLite和DuckDB

文章目录 1 SQLite1.1 世界上最流行的数据库1.1 SQLite简介1.2 插入语句1.3 查询数据1.4 更新数据1.5 删除数据2 DuckDB2.1 DuckDB简介2.2 DuckDB与Python结合使用2.2.1 创建表2.2.2 分析语句2.2.3 导出为parquet文件2.3 Windows中使用DuckDB3 参考附录1 SQLite Python的一个特…...

1.2.神经网络基础

目录 1.2.神经网络基础 1.2.1.Logistic回归 1.2.2 梯度下降算法 1.2.3 导数 1.2.4 向量化编程 1.2.5 正向传播与反向传播 1.2.6.练习 1.2.神经网络基础 1.2.1.Logistic回归 1.2.1.1.Logistic回归 逻辑回归是一个主要用于二分分类类的算法。那么逻辑回归是给定一个x ,…...

算法题目总结-双指针

文章目录 1.滑动窗口类型1.长度最小的子数组1.答案2.思路 2.无重复字符的最长子串1.答案2.思路 2.双指针类型1.盛最多水的容器1.答案2.思路 2.三数之和1.答案2.思路 1.滑动窗口类型 1.长度最小的子数组 1.答案 package com.sunxiansheng.arithmetic.day10;/*** Description:…...

人形机器人将制造iPhone!

前言 优必选机器人和富士康通过一项突破性的合作伙伴关系&#xff0c;正在将先进的人形机器人&#xff08;如Walker S1及其升级版Walker S2&#xff09;整合到制造流程中&#xff0c;以改变iPhone的生产方式。这一合作旨在通过提升机器人能力、优化工作流程以及实现更智能的自动…...

redis 各个模式的安装

一、Redis单机安装 1、安装gcc依赖 Redis是C语言编写的&#xff0c;编译需要GCC。 Redis6.x.x版本支持了多线程&#xff0c;需要gcc的版本大于4.9&#xff0c;但是CentOS7的默认版本是4.8.5。 升级gcc版本&#xff1a; yum -y install centos-release-scl yum -y install d…...

《王者荣耀》皮肤爬虫源码

1.爬取网页 https://pvp.qq.com/web201605/herolist.shtml 2.python代码 import requests from bs4 import BeautifulSoup import os import threading from queue import Queuedef mul(x):if not os.path.exists(x):os.mkdir(x)print("目录创建成功")else:pass h…...

学习ASP.NET Core的身份认证(基于JwtBearer的身份认证8)

为进一步测试通过请求头传递token进行身份验证&#xff0c;在main.htm中增加layui的数据表格组件&#xff0c;并调用后台服务分页显示数据&#xff0c;后台分页查询数据接口如下所示&#xff08;测试时&#xff0c;直接将数据写死到代码中&#xff0c;没有查询数据库&#xff0…...

PyTorch使用教程(6)一文讲清楚torch.nn和torch.nn.functional的区别

torch.nn 和 torch.nn.functional 在 PyTorch 中都是用于构建神经网络的重要组件&#xff0c;但它们在设计理念、使用方式和功能上存在一些显著的区别。以下是关于这两个模块的详细区别&#xff1a; 1. 继承方式与结构 torch.nn torch.nn 中的模块大多数是通过继承 torch.nn…...

React的应用级框架推荐——Next、Modern、Blitz等,快速搭建React项目

在 React 企业级应用开发中&#xff0c;Next.js、Modern.js 和 Blitz 是三个常见的框架&#xff0c;它们提供了不同的特性和功能&#xff0c;旨在简化开发流程并提高应用的性能和扩展性。以下是它们的详解与比较&#xff1a; Next、Modern、Blitz 1. Next.js Next.js 是由 Ve…...

基于GRU实现股价多变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记…...

Java创建对象有几种方式?

大家好&#xff0c;我是锋哥。今天分享关于【Java创建对象有几种方式&#xff1f;】面试题。希望对大家有帮助&#xff1b; Java创建对象有几种方式&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在Java中&#xff0c;创建对象主要有以下几种方式&…...

Vue3初学之Element Plus Dialog对话框,Message组件,MessageBox组件

Dialog的使用&#xff1a; 控制弹窗的显示和隐藏 <template><div><el-button click"dialogVisible true">打开弹窗</el-button><el-dialogv-model"dialogVisible"title"提示"width"30%":before-close&qu…...

基于Python机器学习的双色球数据分析与预测

python统计分析2003-2024年所有的中奖记录,通过人工智能机器学习预测双色球,个人意见,仅供参考. 声明&#xff1a;双色球具有随机性&#xff0c;任何工具无法预测。本文章仅作为技术交流&#xff0c;提供学习参考。本文所涉及的代码均为python之机器学习的代码。双色球为公益事…...

微软Win10 RP 19045.5435(KB5050081)预览版发布!

系统之家1月20日最新报道&#xff0c;微软面向Release Preview频道的Windows Insider项目成员&#xff0c;发布了适用于Windows10 22H2版本的KB5050081更新&#xff0c;更新后系统版本号将升至19045.5435。本次更新增加了对GB18030-2022标准的支持&#xff0c;同时新版日历将为…...

使用 Parcel 和 NPM 脚本进行打包

使用 Parcel 和 NPM 脚本进行打包 Parcel Parcel 是一个零配置的网页应用程序打包工具&#xff0c;主要用于快速构建现代 JavaScript 应用。 我们可以使用npm直接安装它 npm install --save-dev parcel //这将把 Parcel 添加到 devDependencies 中&#xff0c;表明它是一个…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...