最轻量高效的方式是用string.lastindexof("/")定位最后一个斜杠,再用substring()截取其后内容;若路径不含斜杠则返回原字符串;兼容windows需同时检查/和并取更靠右位置。

直接用 String.lastIndexOf("/") 找到最后一个斜杠位置,再用 substring() 截取后面部分即可——这是最轻量、最高效的方式,无需正则或额外类库。
定位最后一个斜杠的位置
lastIndexOf("/") 会从字符串末尾向前搜索,返回最右侧 / 的索引(从 0 开始)。如果路径不含斜杠(如纯文件名 "readme.txt"),它返回 -1,需注意处理。
- 例如:
"/home/user/docs/report.pdf"→ 返回16(/在report.pdf前) - Windows 路径用反斜杠
?那就改用lastIndexOf("\")(注意双反斜杠转义)
截取文件名(含扩展名)
拿到索引后,加 1 跳过斜杠,用 substring(startIndex) 获取后续全部内容:
String path = "/var/log/app/error.log";
int lastSlash = path.lastIndexOf("/");
String filename = (lastSlash == -1) ? path : path.substring(lastSlash + 1); // → "error.log"
- 若
lastSlash为-1,说明无斜杠,整个字符串就是文件名 - 不建议用
substring(lastSlash + 1)不加判断——会抛StringIndexOutOfBoundsException
兼容 Windows 和 Unix 风格路径
实际项目中路径可能混用分隔符。安全做法是同时检查 / 和 \,取更靠后的那个位置:
int pos1 = path.lastIndexOf('/');
int pos2 = path.lastIndexOf('\');
int lastSlash = Math.max(pos1, pos2);
String filename = (lastSlash == -1) ? path : path.substring(lastSlash + 1);
-
Math.max确保选到最右的分隔符(-1比任何有效索引都小,不影响结果) - 对
"C:\Users\name\file.txt"或"/usr/bin/java"都适用
对比:为什么不用 split() 或 File.getName()?
split("/").length 或 new File(path).getName() 虽然也能实现,但有明显缺点:
-
split()创建数组、遍历全部分隔符,时间/空间开销大,且对空结尾路径(如"/tmp/")易出错 -
File构造涉及系统路径解析,还可能触发安全检查,在纯字符串处理场景属于过度设计 -
lastIndexOf + substring是纯内存操作,O(n) 时间内完成一次扫描,零对象分配(Java 9+ 中substring也不共享底层 char 数组)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











