应先用file.getname()或paths.get().getfilename().tostring()提取文件名,再用lastindexof(".")找点位并检查dotindex>0,最后substring截取;否则对archive.tar.gz、.hidden、无点名等会出错。

用 lastIndexOf 和 substring 提取扩展名,确实能跑通,但别直接用
Java 里靠 lastIndexOf(".") 找点、再用 substring 截取,是初学者最常写的方案。它在简单路径下能出结果,但一旦遇到 "archive.tar.gz"、"noext"、".hidden" 或 "file.name.txt" 这类情况,就容易返回错的后缀,甚至抛 StringIndexOutOfBoundsException。
根本问题是:这个组合只找「最后一个点」,不判断点是不是在文件名主体里,也不管点前后有没有字符。
- 如果文件名以点开头(如
".gitignore"),lastIndexOf(".") == 0,substring(1)会取到整个名字,误判为扩展名 - 如果没有点(如
"README"),lastIndexOf返回-1,直接传给substring就崩 - 如果点在路径中(如
"/home/user.my/file.txt"),它其实只该看file.txt那段,但原始字符串里一搜就偏了
先用 File.getName() 或 Paths.get().getFileName().toString() 剥离路径
扩展名属于「文件名」,不是「完整路径」。很多 bug 其实源于没做这一步剥离 —— 比如对 "/var/log/app.log.2024-01" 直接搜点,找到的是 log.2024-01 里的点,而不是 app.log.2024-01 的最后那个。
- 用
new File(path).getName()最轻量,兼容 JDK 6+ - JDK 7+ 更推荐
Paths.get(path).getFileName().toString(),语义更清晰,且自动处理不同平台路径分隔符 - 千万别对原始
path字符串直接操作,尤其当输入来自用户或配置时
lastIndexOf 后必须检查返回值,再决定是否调 substring
安全提取的关键不是“怎么截”,而是“要不要截”。lastIndexOf 返回 -1 表示没点,返回 0 表示点在开头,这两种情况都不该当作有效扩展名处理。
- 正确流程是:
int dotIndex = filename.lastIndexOf(".");→ 判断dotIndex > 0 && dotIndex - 只有满足这两个条件,才说明点在中间、前后都有字符,比如
"data.csv"(dotIndex == 4,长度 8,4 > 0 且 4 - 像
".bashrc"(dotIndex == 0)或"notes"(dotIndex == -1)都应返回空或 null,而不是硬截
示例逻辑:
String filename = Paths.get(path).getFileName().toString();
int dotIndex = filename.lastIndexOf(".");
if (dotIndex > 0 && dotIndex <h3>真要健壮,绕开手动解析,用 <code>FilenameUtils.getExtension()</code> 或 <code>MimeTypesFileTypeMap</code>
</h3><p>自己拼 <code>lastIndexOf</code> + <code>substring</code> 是为了理解原理,不是为了长期维护。真实项目里,边界情况太多:多点压缩包(<code>.tar.gz</code>)、大小写混合(<code>.JPEG</code> vs <code>.jpeg</code>)、无扩展但有 mimetype 的场景……手写很难覆盖全。</p>
- Apache Commons IO 的
FilenameUtils.getExtension()内部做了路径剥离、点位置校验、空值防护,还支持忽略大小写匹配 - 如果需要关联 MIME 类型,
javax.activation.MimetypesFileTypeMap(JDK 8 及以前)或第三方库如tika-mimetypes更可靠 —— 它们查的是内容或注册表,不是文件名 - 自研工具类里若必须手写,请把上述校验逻辑封装成独立方法,别散落在业务代码里
手动解析的坑不在“不会写”,而在“以为写对了”。点的位置、路径层级、空字符串、编码无关字符——每个都可能某天突然冒出来,打断你的部署流程。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











