1 介绍
本文将讨论3中方式来获取文件扩展名。
本文示例直接返回“.”后面。比如“javais.txt”返回“txt”。
2 获取扩展名
获取扩展名的时候,有两个特殊场景:
- 当文件名没有扩展名的时候,比如 makefile。
- 当文件名只有扩展名的时候,比如.gitignore或.DS_Store
2.1 最简单的、基于字符串处理的方法
public Optional<String> getExtensionByStringHandling(String filename) {
return Optional.ofNullable(filename)
.filter(f -> f.contains("."))
.map(f -> f.substring(filename.lastIndexOf(".") + 1));
}
上面代码,通过检查“.”在文件名中的位置,把“.”之后的作为扩展名。
特殊情况:
- 没有扩展名,返回空;
- 只有扩展名,返回扩展名之后的,比如“gitignore”
2.2 Apache Commons IO的FilenameUtils.getExtension
代码如下:
public String getExtensionByApacheCommonLib(String filename) {
return FilenameUtils.getExtension(filename);
}
上面代码,我们传入的filename是一个完整路径,类似:“C:/baeldung/com/demo.java”。FilenameUtils.getExtension会判断文件是否存在。
如果不存在,则原样返回filename。否则,返回文件的扩展名。
此方法调用了FilenameUtils里面的indexOfExtension(String)方法,indexOfExtension又调用了lastIndexOf(char),最终找到最后一个“.”。
还调用了indexOfLastSeparator(String)来判断最后一个“.”后面有没有目录分隔符。
特殊情况:
- 没有扩展名:返回空字符串
- 只有扩展名:返回“.”之后的字符串,比如“gitignore”。
2.3 使用Guava库
基于maven引入Guava:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>24.1.1-jre</version>
</dependency>
使用Files.getFileExtension方法:
public String getExtensionByGuava(String filename) {
return Files.getFileExtension(filename);
}
getFileExtension首先会检查给定的文件名是否存在。
如果非空,会创建一个File实例,并调用File的getName()方法,得到抽象的目录名。
基于这个返回值,利用String的lastIndexOf(char)获取最后一个“.”的位置。
特殊情况:
- 没有扩展名:返回空字符串
- 只有扩展名:返回“.”之后的字符串,比如“gitignore”。
3 结论
Apache Commons和Google Guava各有特点,根据需要选择即可。
本文代码见github