hutool 文件操作相关的类

hutool 文件操作相关的类

介绍

Hutool 里的文件相关工具:

IOUtil :操作流的

FileUtil :操作文件的

FileTypeUtil: 被包含在FileUtil里了

FileReader,FileWriter:这两个基本上都在FileUtil里用了

WatchMonitor: 用来监控文件变化,可以看看自己c盘,平时文件都有什么变化。

ClassPathResource 是class 路径下资源的获取

IOUtil

拷贝

在这里插入图片描述

把输入流的数据复制到输出流中

long copy(InputStream in, OutputStream out)

Stream转Reader、Writer

IoUtil.getReader:将InputStream转为BufferedReader用于读取字符流,它是部分readXXX方法的基础。
IoUtil.getWriter:将OutputStream转为OutputStreamWriter用于写入字符流,它是部分writeXXX的基础。

读取流中的内容

读取输入流的内容为字符串

String read(InputStream in, String charsetName)
读取流中的内容总结下来,可以分为read方法和readXXX方法。

read方法有诸多的重载方法,根据参数不同,可以读取不同对象中的内容,这包括:
InputStream
Reader
FileChannel
这三个重载大部分返回String字符串,为字符流读取提供极大便利。

readXXX方法主要针对返回值做一些处理,例如:
readBytes 返回byte数组(读取图片等)
readHex 读取16进制字符串
readObj 读取序列化对象(反序列化)
readLines 按行读取
toStream方法则是将某些对象转换为流对象,便于在某些情况下操作:
String 转换为ByteArrayInputStream
File 转换为FileInputStream

写入到流

把数据写出到输出流中

void writeUtf8(OutputStream out, boolean isCloseOut, Object… contents)

IoUtil.write方法有两个重载方法,一个直接调用OutputStream.write方法,另一个用于将对象转换为字符串(调用toString方法),然后写入到流中。
IoUtil.writeObjects 用于将可序列化对象序列化后写入到流中。
write方法并没有提供writeXXX,需要自己转换为String或byte[]。

关闭

对于IO操作来说,使用频率最高(也是最容易被遗忘)的就是close操作,好在Java规范使用了优雅的Closeable接口,这样我们只需简单封装调用此接口的方法即可。

关闭操作会面临两个问题:

被关闭对象为空
对象关闭失败(或对象已关闭)
IoUtil.close方法很好的解决了这两个问题。

FileUtil

是否是windows系统 (通过分隔符进行判断)

boolean isWindows

追加数据

File appendString(String content, File file, String charset)

遍历当前目录及其子目录

List loopFiles(String path)

目录及其子目录所有文件的大小总和

long size(File file)

创建文件,会自动创建父文件夹。 方法名故意用linux下的命令名

File touch(String fullFilePath)

删除文件或者目录(这个很危险,会自动删除当前目录以及子目录,慎用)

boolean del(String fullFileOrDirPath)

同上

static boolean clean(String dirPath)

复制文件或者目录

File copyFile(String src, String dest, StandardCopyOption… options)

判断俩文件内容是否一样

boolean contentEquals(File file1, File file2)

获取后缀名,不带.

String extName(String fileName)

根据文件头部信息获取文件类型

String getType(File file)

读取内容为字符串

readString(String path, String charsetName)

读取内容为集合

List readLines(String path, String charset)

把字符串写入到文件

File writeString(String content, String path, String charset)

把集合写入到文件

File writeLines(Collection list, File file, String charset)

转换文件编码,第一个参数必须和文件本身编码保持一致,否则就会出错。比如一个文件是GBK的,但是在UTF默认编码的环境下看到都是乱码,就可以通过这个转换一下

File convertCharset(File file, Charset srcCharset, Charset destCharset)

指定换行符,有些文件从Linux搞来的,在window下换行会混乱,可以用这个进行转换

convertLineSeparator(File file, Charset charset, LineSeparator lineSeparator)

获取CRC32校验码

long checksumCRC32(File file)

获取Web项目下的web root路径

File getWebRoot()

根据文件后缀名 (不一定是真实格式),获取其mimetype

String getMimeType(String filePath)

WatchMonitor

File file = FileUtil.file("D:\\image\\testSave\\2025-3-4\\camera0");//这里只监听文件或目录的修改事件WatchMonitor watchMonitor = WatchMonitor.create(file, WatchMonitor.EVENTS_ALL);watchMonitor.setWatcher(new Watcher(){@Overridepublic void onCreate(WatchEvent<?> event, Path currentPath) {Object obj = event.context();log.info("创建:{}-> {}", currentPath, obj);}@Overridepublic void onModify(WatchEvent<?> event, Path currentPath) {//Object obj = event.context();//log.info("修改:{}-> {}", currentPath, obj);}@Overridepublic void onDelete(WatchEvent<?> event, Path currentPath) {Object obj = event.context();log.info("删除:{}-> {}", currentPath, obj);}@Overridepublic void onOverflow(WatchEvent<?> event, Path currentPath) {Object obj = event.context();log.info("Overflow:{}-> {}", currentPath, obj);}});//设置监听目录的最大深入,目录层级大于制定层级的变更将不被监听,默认只监听当前层级目录watchMonitor.setMaxDepth(Integer.MAX_VALUE);//启动监听watchMonitor.start();

// 延迟处理监听事件
//在监听目录或文件时,如果这个文件有修改操作,JDK会多次触发modify方法,为了解决这个问题,
// 我们定义了DelayWatcher,
// 此类通过维护一个Set将短时间内相同文件多次modify的事件合并处理触发,从而避免以上问题。
WatchMonitor monitor = WatchMonitor.createAll(“D:\image\testSave\2025-3-4\camera0”, new DelayWatcher(new SimpleWatcher(){
@Override
public void onModify(WatchEvent<?> event, Path currentPath) {
log.info(“EVENT modify”);
}
}, 500));
monitor.start();

ClassPathResource

在Java编码过程中,我们常常希望读取项目内的配置文件,按照Maven的习惯,这些文件一般放在项目的src/main/resources下,读取的时候使用:

String path = “config.properties”;
InputStream in = this.class.getResource(path).openStream();
使用当前类来获得资源其实就是使用当前类的类加载器获取资源,最后openStream()方法获取输入流来读取文件流。

封装
面对这种复杂的读取操作,我们封装了ClassPathResource类来简化这种资源的读取:

ClassPathResource resource = new ClassPathResource(“test.properties”);
Properties properties = new Properties();
properties.load(resource.getStream());

Console.log(“Properties: {}”, properties);
这样就大大简化了ClassPath中资源的读取。

Hutool提供针对properties的封装类Props,同时提供更加强大的配置文件Setting类,这两个类已经针对ClassPath做过相应封装,可以以更加便捷的方式读取配置文件。

文件类型判断

  File file = FileUtil.file("D:。。。。。");String type = FileTypeUtil.getType(file);//输出的是文件的格式log.info(type);

监控”文件的变化,类似于Linux下的tail -f命令

Tailer tailer = new Tailer(FileUtil.file("d:/桌面/test.log"), Tailer.CONSOLE_HANDLER, 2);
tailer.start();

/*** 命令行打印的行处理器* */
public static class ConsoleLineHandler implements LineHandler {@Overridepublic void handle(String line) {Console.log(line);}
}

相关新闻

开放鸿蒙OpenHarmony 5.0.0 Release 兼容性测试实战经验分享

开放鸿蒙OpenHarmony 5.0.0 Release 兼容性测试实战经验分享

OpenHarmony 5.0版本的发布时间是2024年12月20日至21日。这个版本带来了许多新特性和改进。现在5.0出了两个release 版本&#xff0c;分别是5.0.0和5.0.1。 就在5.0版本发布不到2周的时间内&#xff0c;2025年01月01日起&#xff0c;不支持新产品基于老分支&#xff08;OpenHar…

2026/7/19 8:29:16 阅读更多 →
Nginx代理Kafka集群

Nginx代理Kafka集群

背景 项目是需要从生产单位上传数据到集团&#xff0c;由于公司生产环境网络端口个数限制&#xff0c;因此考虑用Nginx代理出Kafka集群。便 于理解&#xff0c;附上系统部署架构图如下&#xff1a; 动手搞起来 hosts 配置 kafka的监听配置中&#xff0c;用主机名进行配置与…

2026/7/19 11:54:16 阅读更多 →
2025-03-04 学习记录--C/C++-PTA 练习5-3 字符金字塔

2025-03-04 学习记录--C/C++-PTA 练习5-3 字符金字塔

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 二、解题步骤 ⭐️ 第1步、把字符和一个空格看作整体&#xff0c;即"G_"&#xff1b; 第2步、外…

2026/7/16 3:46:13 阅读更多 →
2026 年 7 月新发布:立山热门的钢制闸门供应商哪个好,别再用老方法!揭秘钢制闸门的惊人耐用性 - 企业推荐官【认证官方】

2026 年 7 月新发布:立山热门的钢制闸门供应商哪个好,别再用老方法!揭秘钢制闸门的惊人耐用性 - 企业推荐官【认证官方】

2026 年 7 月新出的:立山热门的钢制闸门供应商是哪个好?不要使用以往的方法了到了 2026 年的时候,水利工程、市政排水、农业灌溉等行业会不断地发展起来,对钢制闸门的需求量也会越来越大。不论是从城市排水系统保持…

2026/7/19 19:57:56 阅读更多 →
Qt开发实战:编译调试与界面优化技巧

Qt开发实战:编译调试与界面优化技巧

1. Qt开发中的编译与调试技巧 1.1 高效处理编译错误 当遇到大量编译错误时&#xff0c;经验告诉我们应该从第一个错误开始逐个解决。很多情况下&#xff0c;后面的错误都是由前面的错误引发的连锁反应。比如可能只是写错了一行代码&#xff0c;却导致编译器报出几百个错误。这…

2026/7/19 19:58:49 阅读更多 →
AI 产品的灰度发布策略:逐步放量验证模型效果

AI 产品的灰度发布策略:逐步放量验证模型效果

AI 产品的灰度发布策略&#xff1a;逐步放量验证模型效果 一、AI 版本的「不可回滚」特性 传统软件发布&#xff0c;如果新版本有问题&#xff0c;回滚到上一个版本通常能完美修复。但 AI 产品的发布&#xff0c;不同——当你切换到新的 Prompt、新的模型版本、或新的微调模型时…

2026/7/19 19:58:49 阅读更多 →
免费统计分析软件JASP:让数据分析变得简单直观

免费统计分析软件JASP:让数据分析变得简单直观

免费统计分析软件JASP&#xff1a;让数据分析变得简单直观 【免费下载链接】jasp-desktop JASP aims to be a complete statistical package for both Bayesian and Frequentist statistical methods, that is easy to use and familiar to users of SPSS 项目地址: https://…

2026/7/19 19:58:49 阅读更多 →
LIME可解释性原理:局部线性近似如何让黑箱模型开口说话

LIME可解释性原理:局部线性近似如何让黑箱模型开口说话

1. 这不是“解释模型”&#xff0c;而是给黑箱装上一扇可推开的观察窗你训练好一个XGBoost模型&#xff0c;AUC做到0.92&#xff0c;业务方点头说“很好”&#xff1b;但当风控部门问“为什么拒绝这张信用卡申请&#xff1f;”——你卡住了。不是模型不准&#xff0c;是它不说话…

2026/7/19 19:58:49 阅读更多 →
Python Pygame飞机大战实战:从零到一构建经典2D游戏

Python Pygame飞机大战实战:从零到一构建经典2D游戏

1. 项目概述&#xff1a;为什么选择Pygame飞机大战作为你的第一个项目&#xff1f;如果你刚刚开始学习Python&#xff0c;或者已经学了一段时间语法&#xff0c;但总觉得纸上谈兵&#xff0c;不知道如何把那些变量、循环、函数变成真正能跑起来的东西&#xff0c;那你来对地方了…

2026/7/19 19:58:49 阅读更多 →
鸿蒙 ArkTS 实战:Emoji Idiom Guess 从表情成语猜谜到交互闭环完整解析

鸿蒙 ArkTS 实战:Emoji Idiom Guess 从表情成语猜谜到交互闭环完整解析

鸿蒙 ArkTS 实战&#xff1a;Emoji Idiom Guess 从表情成语猜谜到交互闭环完整解析 前言 Emoji Idiom Guess 是一个基于鸿蒙 ArkTS 编写的单页互动应用&#xff0c;核心围绕 表情线索、答案输入、首字母提示和收藏关卡 展开。项目没有依赖复杂服务端&#xff0c;也没有把逻辑…

2026/7/19 0:00:03 阅读更多 →
Unity与Python本地通信:基于Flask的跨语言数据交换实战

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述&#xff1a;为什么我们需要一个本地通信服务器&#xff1f;在游戏开发、数字孪生、仿真训练等众多领域&#xff0c;Unity作为强大的实时3D内容创作平台&#xff0c;其核心逻辑通常由C#驱动。然而&#xff0c;当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/19 0:00:04 阅读更多 →
科研课题设计全流程:从选题到成果落地的实战指南

科研课题设计全流程:从选题到成果落地的实战指南

1. 课题设计全流程解析&#xff1a;从选题到成果落地的实战指南课题设计是科研工作者、高校师生以及企业研发人员日常工作中的核心环节。一个优秀的课题设计不仅决定了研究的方向和质量&#xff0c;更直接影响最终成果的学术价值和应用前景。作为在科研一线摸爬滚打多年的从业者…

2026/7/19 0:00:04 阅读更多 →
鸿蒙 ArkTS 实战:Emoji Idiom Guess 从表情成语猜谜到交互闭环完整解析

鸿蒙 ArkTS 实战:Emoji Idiom Guess 从表情成语猜谜到交互闭环完整解析

鸿蒙 ArkTS 实战&#xff1a;Emoji Idiom Guess 从表情成语猜谜到交互闭环完整解析 前言 Emoji Idiom Guess 是一个基于鸿蒙 ArkTS 编写的单页互动应用&#xff0c;核心围绕 表情线索、答案输入、首字母提示和收藏关卡 展开。项目没有依赖复杂服务端&#xff0c;也没有把逻辑…

2026/7/19 0:00:03 阅读更多 →
Unity与Python本地通信:基于Flask的跨语言数据交换实战

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述&#xff1a;为什么我们需要一个本地通信服务器&#xff1f;在游戏开发、数字孪生、仿真训练等众多领域&#xff0c;Unity作为强大的实时3D内容创作平台&#xff0c;其核心逻辑通常由C#驱动。然而&#xff0c;当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/19 0:00:04 阅读更多 →
科研课题设计全流程:从选题到成果落地的实战指南

科研课题设计全流程:从选题到成果落地的实战指南

1. 课题设计全流程解析&#xff1a;从选题到成果落地的实战指南课题设计是科研工作者、高校师生以及企业研发人员日常工作中的核心环节。一个优秀的课题设计不仅决定了研究的方向和质量&#xff0c;更直接影响最终成果的学术价值和应用前景。作为在科研一线摸爬滚打多年的从业者…

2026/7/19 0:00:04 阅读更多 →
ai agent框架spring ai/alibaba 源码原理分析(六) agent和组件

ai agent框架spring ai/alibaba 源码原理分析(六) agent和组件

简介 saa是java的ai agent框架&#xff0c;本系列将深入剖析 Spring AI Alibaba 的源码实现与核心原理&#xff0c;不仅可以指导agent的开发&#xff0c;更可以改造框架&#xff0c;增加新特性 系列内容&#xff1a; 系列(一) 架构 完成 系列(三) 调用 I 工具 完成 II M…

2026/7/19 0:01:20 阅读更多 →
终极指南:如何用Steam-auto-crack实现Steam游戏自动破解

终极指南:如何用Steam-auto-crack实现Steam游戏自动破解

终极指南&#xff1a;如何用Steam-auto-crack实现Steam游戏自动破解 【免费下载链接】Steam-auto-crack Steam Game Automatic Cracker 项目地址: https://gitcode.com/gh_mirrors/st/Steam-auto-crack Steam-auto-crack是一款功能强大的Steam游戏自动破解工具&#xff…

2026/7/19 9:10:31 阅读更多 →
移动端游戏功耗测试实战:电流、功率、亮度和场景对比

移动端游戏功耗测试实战:电流、功率、亮度和场景对比

移动端游戏功耗测试:先控制变量,再比较优化是否真的省电 摘要:功耗测试最容易犯的错误,是拿两次不同温度、不同亮度、不同场景的平均功率直接比较。本文给出一套可复现的游戏功耗测试方法,覆盖引擎特性验证、版本回归和黑盒体验测试,并说明如何把功耗与帧率、温控、CPU/G…

2026/7/19 19:29:48 阅读更多 →