hutool的dateutil解析时间出错主因是时区未显式处理或默认localdatetime模式不兼容带时区字符串;fileutil复制大文件卡死因阻塞单缓冲且无校验;httputil默认吞响应体致400错误信息丢失;strutil.isblank比isempty更实用因能识别空格类“假空”。

为什么 Hutool 的 DateUtil 解析时间总出错?
不是时间格式写错了,大概率是没处理好时区或默认模式。Java 原生 SimpleDateFormat 非线程安全,而 DateUtil 默认用的是 LocalDateTime 模式(无时区),一旦传入带 Z 或 +0800 的字符串,直接抛 DateTimeParseException。
- 解析含时区的时间,必须显式用
DateUtil.parseUTC或DateUtil.parseByPattern配合DateTimeFormatter指定时区 - 从 HTTP Header 读
date字段(如Wed, 01 Jan 2025 00:00:00 GMT),要用DateUtil.parseInternetDate,别硬套yyyy-MM-dd HH:mm:ss - 注意
DateUtil.parse对模糊格式(如20250101)会自动尝试多种模式,可能误判成yyyyMd而非yyyyMMdd,建议固定用parseByPattern
FileUtil 复制大文件卡死或丢数据?
默认的 FileUtil.copy 是阻塞式、单缓冲流,不设超时、不监控进度,遇到网络盘或 USB 设备响应慢,线程就挂住;更隐蔽的问题是:它不会校验目标文件是否完整写入,断电或中断后容易残留半截文件。
- 复制 >100MB 文件,改用
FileUtil.copyFileInputStream+ 自定义BufferedInputStream(缓冲区设为8192或65536),避免小块频繁 IO - 关键业务场景(如备份),复制后必须调用
FileUtil.compare校验源目md5,别只看length() - 不要用
FileUtil.writeUtf8String直接覆盖配置文件——它会先清空再写,崩溃时配置全丢;应写临时文件 +FileUtil.move原子替换
Spring Boot 里 HttpUtil 发请求 400 却没报错信息?
因为 HttpUtil.get/post 默认吞掉响应体,只抛异常不带原始错误内容,你看到的 HttpRequestException 里只有状态码和连接超时提示,根本不知道服务端返回了什么 JSON 错误提示。
- 调试阶段务必加
.setReadTimeout(5000)和.setConnectionTimeout(3000),否则默认无限等待 - 捕获异常后,用
HttpUtil.createGet(url).execute().body()手动重发一次并打印body(),才能看到真实错误响应 - POST 提交
application/json,别用map直传——HttpUtil.post(url, map)会当application/x-www-form-urlencoded发,要改成HttpUtil.post(url, JSON.toJSONString(map))并手动设contentType("application/json")
StrUtil 判空为什么 isBlank 比 isEmpty 更常用?
因为绝大多数业务字段(数据库查出来、前端传过来)不是 null 就是空格+换行组成的“假空字符串”,isEmpty 只判长度,isBlank 才真正解决“这玩意儿到底有没有有效内容”的问题。
立即学习“Java免费学习笔记(深入)”;
- 表单提交校验、SQL 拼接前的参数过滤、JSON 字段默认值填充,一律用
StrUtil.isBlank(str),别手写str == null || str.trim().length() == 0 -
StrUtil.subPre和subSuf截取时,如果起始位置越界,默认返回原串而非抛异常——这点和String.substring行为不同,容易掩盖逻辑错误,需要提前用StrUtil.length校验长度 - 敏感字段脱敏(如手机号
138****1234),用StrUtil.hide最稳,它内部处理了null和长度不足的情况,比自己写replace+substring安全
Hutool 当黑盒——它封装得越顺手,越容易忽略底层是 JDK 哪个类在干活。比如 cn.hutool.core.date.DateUtil 底层调的是 java.time,但某些老项目还在用 jdk1.7,就得降级到 hutool-all 5.8.22 版本,否则编译直接失败。










