目录
- 前言
- 1. 基础方法:lastIndexOf + substring
- 2. 字符串分割:split 方法
- 3. 正则表达式
- 4. Apache Commons IO 的 FilenameUtils
- 5. Spring框架的 StringUtils
- 6. 使用 File 类
- 7. Java NIO的 Paths 类
- 8. 结合MIME类型验证
- 9. 自定义枚举过滤
- 10. 使用Lombok的 @Cleanup 简化代码
- 方法对比表
- 最佳实践建议
- 总结
前言
在Java开发中,尤其是Web应用或文件处理场景中,获取文件后缀名是一个高频需求。无论是文件上传验证、类型过滤、格式校验,还是日志记录,后缀名的正确提取都是核心基础。
1. 基础方法:lastIndexOf + substring
定义:通过定位最后一个 . 的位置,截取后缀名。
入参:MultipartFile file
依赖:无
代码示例:
public static String getExtension(MultipartFile file) {
if (file == null) {
return "";
}
String originalFilename = file.getOriginalFilename();
if (originalFilename == null || originalFilename.isEmpty()) {
return "";
}
int dotIndex = originalFilename.lastIndexOf('.');
if (dotIndex == -1 || dotIndex == originalFilename.length() - 1) {
return "";
}
return originalFilename.substring(dotIndex + 1).toLowerCase();
}
执行效果:
- 文件名
report_v2.2023.xlsx→ 返回xlsx - 文件名
image.→ 返回空字符串 - 文件名
.gitignore→ 返回gitignore
2. 字符串分割:split 方法
定义:通过 . 分割文件名,取最后一个元素。
入参:MultipartFile file
依赖:无
代码示例:
public static String getExtension(MultipartFile file) {
if (file == null) {
return "";
}
String originalFilename = file.getOriginalFilename();
if (originalFilename == null) {
return "";
}
String[] parts = originalFilename.split("\\.");
return parts.length > 1 ? parts[parts.length - 1].toLowerCase() : "";
}
执行效果:
- 文件名
archive.v1.7z&http://www.devze.comnbsp;→ 返回7z - 文件名
file→ 返回空字符串
3. 正则表达式
定义:通过正则匹配最后一个 . 后的字符串。
入参:MultipartFile file
依赖:无
代码示例:
public static String getExtension(MultipartFile file) {
if (file == null) {
return "";
}
String originalFilename = file.getOriginalFilename();
if (originalFilename == null) {
return "";
}
Pattern pattern = Pattern.compile("\\.(\\w+)$");
Matcher matcher = pattern.matcher(originalFilename);
return matcher.find() ? matcher.group(1).toLowerCase() : "";
}
执行效果:
- 文件名
document.pdf→ 返回pdf - 文件名
file.tar.gz→ 返回gz
4. Apache Commons IO 的 FilenameUtils
定义:使用 Apache Commons IO 的工具类。
入参:MultipartFile file
依赖:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>9.0.0</version>
</dependency>
代码示例:
import org.apache.commons.io.FilenameUtils;
public static String getExtension(MultipartFile file) {
if (file == null) {
return "";
}
String originalFilename = file.getOriginalFilename();
return FilenameUtils.getExtension(originalFilename).toLowerCase();
}
执行效果:
- 文件名
file.txt→ 返回txt - 文件名
file.→ 返回空字符串
5. Spring框架的 StringUtils
定义:使用 Spring 的工具类。
入参:MultipartFile file
依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>python;spring-core</artifactId>
<version>6.0.10</version>
</dependency>
代码示例:
import org.springframework.util.StringUtils;
public static String getExtension(MultipartFile file) {
if (file == null) {
return "";
}
String originalFilename = file.getOriginalFilename();
return StringUtils.getFilenameExtension(originalFilename);
}
执行效果:
- 文件名
image.jpg→ 返回jpg - 返回值为
null时需注意空指针(如file无扩展名)。
6. 使用 File 类
定义:通过构造 File 对象提取文件名。
入参:MultipartFile file
依赖:无
代码示例:
import java.io.File;
public static String getExtension(MultipartFile file) {
if (file == null) {
return "";
}
String originalFilename = file.getOriginalFilename();
if (originalFilename == null) {
return "";
}
File tempFile = new File(originalFilename);
String name = tempFile.getName();
int dotIndex = name.lastIndexOf('.');
return (dotIndex > 0 && dotIndex < name.length() - 1)
? name.substring(dotIndex + 1).toLowerCase()
: "";
}
执行效果:
- 文件名
data.csv→ 返回csv - 文件名
config.→ 返回空字符串
7. Java NIO的 Paths 类
定义:通过 java.nio.file 包处理路径。
入参:MultipartFile file
依赖:无
代码示例:
import java.nio.file.Path;
import java.nio.file.Paths;
public static String getExtension(MultipartFile file) {
if (file == null) {
return "";
}
String originalFilename = file.getOriginalFilename();
if (originalFilename == null) {
return "";
}
Path path = Paths.get(originalFilename);
String name = path.getFileName()编程.toString();
return name.substring(name.lastIndexOf('.') + 1).toLowerCase();
}
执行效果:js
- 文件名
report.pdf→ 返回pdf - 跨平台兼容性好(如路径
/home/file.txt→ 提取txt)。
8. 结合MIME类型验证
定义:通过 MultipartFile.getContentType() 验证后缀。
入参:MultipartFile file
javascript依赖:无
代码示例:
public static boolean validateFile(MultipartFile file) {
String ext = getExtension(file); // 使用上述任意方法
String contentType = file.getContentType();
return ext.equals("jpg") && contentType.equals("image/jpeg");
}
执行效果:
- 文件名
image.jpg且 MIME 为image/jpeg→ 返回true - 文件名
image.png但 MIME 为image/jpeg→ 返回false
9. 自定义枚举过滤
定义:通过枚举限定允许的后缀。
入参:MultipartFile file
代码示例:
enum FileType {
PNG, JPG, JPEG, GIF;
public static boolean isValid(String ext) {
for (FileType type : FileType.values()) {
if (type.name().equalsIgnoreCase(ext)) {
return true;
}
}
return false;
}
}
public static String getValidExtension(MultipartFile file) {
String ext = getExtension(file);
return FileType.isValid(ext) ? ext : "";
}
执行效果:
- 文件名
photo.jpg→ 返回jpg - 文件名
image.bmp→ 返回空字符串
10. 使用Lombok的 @Cleanup 简化代码
定义:通过 Lombok 减少资源管理代码。
入参:MultipartFile file
依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.28</version>
<scope>provided</scope>
</dependency>
代码示例:
import lombok.Cleanup;
public static String getExtension(MultipartFile file) {
if (file == null) {
return "";
}
@Cleanup
InputStream inputStream = file.getInputStream();
// 其他逻辑(如读取文件内容)
return "ext"; // 示例返回值
}
执行效果:
- 自动关闭
inputStream,无需手动管理资源。
方法对比表
| 方法 | 依赖 | 边界处理 | 性能 | 适用场景 |
|---|---|---|---|---|
lastIndexOf + substring | 无 | 完善(需手动处理) | 高 | 简单场景,无依赖要求 |
split | 无 | 简单(需数组长度判断) | 中 | 快速实现,无特殊需求 |
| 正则表达式 | 无 | 灵活(正则可扩展) | 中 | 需复杂匹配时 |
| Apache Commons IO | commons-io | 自动处理 | 高 | 需多文件操作功能 |
Spring StringUtils | spring-core | 自动处理 | 高 | Spring生态内使用 |
File 类 | 无 | 基础 | 中 | 需路径处理时 |
Java NIO Paths | 无 | 基础 | 中 | 现代API,跨平台需求 |
| MIME类型验证 | 无 | 依赖MIME类型 | 高 | 安全验证场景 |
最佳实践建议
依赖选择:
- 零依赖场景:优先使用
lastIndexOf或split。 - 复杂需求:使用 Apache Commons IO 或 Spring 的
StringUtils。
- 零依赖场景:优先使用
边界情况处理:
- 文件名以
.开头(如.gitignore):返回后缀gitignore。 - 文件名无扩展名(如
file):返回空字符串。 - 文件名以
.结尾(如file.):返回空字符串。
- 文件名以
后缀统一小写:
- 使用
toLowerCase()避免大小写敏感问题(如JPG→jpg)。
- 使用
安全验证:
- 结合MIME类型与后缀双重校验(如
image/jpeg与jpg)。
- 结合MIME类型与后缀双重校验(如
总结
针对 MultipartFile 的后缀名获取,选择需结合项目需求:
- 基础场景:推荐
lastIndexOf或 Apache Commons IO。 - Spring生态:直接使用
StringUtils.getFilenameExtension。 - 安全敏感场景:结合MIME类型验证。
以上就是Java获取文件后缀名的方法小结的详细内容,更多关于Java获取文件后缀名的资料请关注编程客栈(www.devze.com)其它相关文章!
加载中,请稍侯......
精彩评论