| name | commons-patterns |
| description | Apache Commons 最佳实践模式。从官方文档提炼,覆盖 Commons Lang3(StringUtils千面判空/isEmpty vs isBlank/Validate抛NullPointerException迁移)、Commons IO(IOUtils.toString大文件陷阱/FileUtils.lineIterator逐行读模式/FilenameUtils.normalize路径规范化)、Commons Collections4(CollectionUtils.union/intersection/subtract集合运算)。
纠正 LLM 误用:混淆 StringUtils.isBlank vs isEmpty、IOUtils.toString 读大文件OOM、不知道 LineIterator 逐行读模式、用 lang 而非 lang3 包名。
|
| license | Apache-2.0 |
Apache Commons 最佳实践模式
来源: Commons Home | Lang3 User Guide | IO Description
Capability Boundaries
✅ Strong Suits
- StringUtils 判空模式 — isEmpty vs isBlank vs defaultString 精确语义选择
- Commons IO 文件操作 — FileUtils 读写复制 / IOUtils 流操作 / LineIterator 逐行
- Commons Collections4 — CollectionUtils/MultiValuedMap/MapUtils
- RandomStringUtils — 生成随机字符串(验证码/Token/临时密码)
- Validate — 参数校验(注意3.0起抛NullPointerException而非IllegalArgumentException)
❌ Out of Scope
- 中文特色(身份证/拼音) → hutool-patterns
- 不可变集合/缓存/EventBus → guava-patterns
- Bean映射/JSON → mapstruct-patterns/jackson-patterns
Commons vs Guava vs Hutool 选择表
| 场景 | Commons | Guava | Hutool | 优先选 |
|---|
| 字符串判空/截断/填充 | ⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ | 任意(团队约定) |
| 文件复制/删除/读行 | ⭐⭐⭐ | ⭐ | ⭐⭐ | Commons IO |
| 文件名/路径处理 | ⭐⭐⭐ | — | ⭐⭐ | Commons IO |
| 集合运算(交/并/差) | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ | 任意 |
| 日期处理(旧Date) | ⭐ | — | ⭐⭐⭐ | Java8 Time |
| 随机字符串 | ⭐⭐⭐ | — | ⭐⭐ | Commons Lang3 |
| HTML/XML转义 | ⭐⭐⭐ | — | ⭐ | Commons Lang3 |
| 数学/统计 | ⭐⭐⭐ | — | ⭐ | Commons Math |
核心模式
模式 1: StringUtils 判空精确语义
StringUtils.isEmpty(null);
StringUtils.isEmpty("");
StringUtils.isEmpty(" ");
StringUtils.isEmpty("abc");
StringUtils.isBlank(null);
StringUtils.isBlank("");
StringUtils.isBlank(" ");
StringUtils.isBlank("abc");
StringUtils.defaultString(str, "");
StringUtils.defaultIfBlank(str, "N/A");
StringUtils.leftPad("1", 3, '0');
StringUtils.abbreviate("very long text", 10);
模式 2: Commons IO 文件模式
String content = FileUtils.readFileToString(file, StandardCharsets.UTF_8);
List<String> lines = FileUtils.readLines(file, StandardCharsets.UTF_8);
LineIterator it = FileUtils.lineIterator(file, "UTF-8");
try { while (it.hasNext()) { String line = it.nextLine(); }
} finally { LineIterator.closeQuietly(it); }
InputStream in = new URL("https://example.com").openStream();
try { String result = IOUtils.toString(in, StandardCharsets.UTF_8); }
finally { IOUtils.closeQuietly(in); }
FileUtils.writeStringToFile(file, content, StandardCharsets.UTF_8);
FileUtils.copyFile(src, dest);
FileUtils.forceMkdir(dir);
FileUtils.deleteDirectory(dir);
FilenameUtils.getExtension("archive.tar.gz");
FilenameUtils.getBaseName("/path/file.txt");
String normalized = FilenameUtils.normalize("C:/a/../b/file.txt");
模式 3: Commons Lang3 迁移注意事项
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;
模式 4: Validate 的参数校验
Validate.notNull(obj, "参数不能为空: %s", name);
Validate.isTrue(age > 0, "年龄必须>0");
模式 5: RandomStringUtils
RandomStringUtils.randomAlphanumeric(6);
RandomStringUtils.randomAlphanumeric(32);
RandomStringUtils.randomNumeric(6);
RandomStringUtils.randomAlphabetic(8);
模式 6: 集合运算
CollectionUtils.isEmpty(coll);
CollectionUtils.union(list1, list2);
CollectionUtils.intersection(list1, list2);
CollectionUtils.subtract(list1, list2);
MapUtils.getString(map, "key", "default");
Gotchas
- isEmpty vs isBlank — isEmpty(" ")→true(不含空格),isBlank(" ")→true(含空格)
- IOUtils.toString 加载整个流到内存 — 大文件(>10MB)用 LineIterator 逐行读
- IOUtils.toString 不关流 — 配合 finally { IOUtils.closeQuietly(in) }
- Lang3 DateUtils 与 Java8 LocalDateTime 不兼容 — 用 java.time API,仅旧Date用Commons
- Collections4 包名是 collections4 — 不是 collections(那是3.x)
- Lang3 3.0 起 isAlpha/isNumeric/isAlphanumeric("")→false — 以前版本返回true
- Maven坐标: groupId=org.apache.commons, artifactId=commons-lang3 — 不是 commons-lang
- Validate.notNull 抛 NullPointerException — Validate.isTrue 抛 IllegalArgumentException
Data Privacy
本技能不收集、存储或传输任何用户数据。