Java获取文件后缀名的方法小结

 更新时间:2025年05月21日 09:59:08   作者:李少兄  
在Java开发中,尤其是Web应用或文件处理场景中,获取文件后缀名是一个高频需求,无论是文件上传验证、类型过滤、格式校验,还是日志记录,后缀名的正确提取都是核心基础,本文给大家介绍了Java获取文件后缀名的方法,需要的朋友可以参考下

前言

在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 → 返回 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>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();
}

执行效果

  • 文件名 report.pdf → 返回 pdf
  • 跨平台兼容性好(如路径 /home/file.txt → 提取 txt)。

8. 结合MIME类型验证

定义:通过 MultipartFile.getContentType() 验证后缀。

入参MultipartFile file

​​​​​​​依赖:无

代码示例

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 IOcommons-io自动处理需多文件操作功能
Spring StringUtilsspring-core自动处理Spring生态内使用
File 类基础需路径处理时
Java NIO Paths基础现代API,跨平台需求
MIME类型验证依赖MIME类型安全验证场景

最佳实践建议

  1. 依赖选择

    • 零依赖场景:优先使用 lastIndexOf 或 split
    • 复杂需求:使用 Apache Commons IO 或 Spring 的 StringUtils
  2. 边界情况处理

    • 文件名以 . 开头(如 .gitignore):返回后缀 gitignore
    • 文件名无扩展名(如 file):返回空字符串。
    • 文件名以 . 结尾(如 file.):返回空字符串。
  3. 后缀统一小写

    • 使用 toLowerCase() 避免大小写敏感问题(如 JPG → jpg)。
  4. 安全验证

    • 结合MIME类型与后缀双重校验(如 image/jpeg 与 jpg)。

总结

针对 MultipartFile 的后缀名获取,选择需结合项目需求:

  • 基础场景:推荐 lastIndexOf 或 Apache Commons IO。
  • Spring生态:直接使用 StringUtils.getFilenameExtension
  • 安全敏感场景:结合MIME类型验证。

以上就是Java获取文件后缀名的方法小结的详细内容,更多关于Java获取文件后缀名的资料请关注脚本之家其它相关文章!

相关文章

  • Mybatis自定义typeHandle过程解析

    Mybatis自定义typeHandle过程解析

    这篇文章主要介绍了Mybatis自定义typeHandle过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Java Spring 事件监听详情解析

    Java Spring 事件监听详情解析

    这篇文章主要介绍了Java Spring 事件监听详情解析,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • Java线程池获取池中所有线程列表的方法总结

    Java线程池获取池中所有线程列表的方法总结

    在Java中,获取线程池中所有线程列表并不是一个直接支持的功能,因为线程池的设计通常是为了隐藏和管理底层的线程细节,从而提供更高层次的抽象和并发控制能力,本文给大家介绍了Java线程池获取池中所有线程列表的方法,需要的朋友可以参考下
    2024-10-10
  • SpringBoot常用脱敏方案小结

    SpringBoot常用脱敏方案小结

    本文系统分析了四种主流数据脱敏技术方案,包括Jackson注解式、AOP拦截式、DTO手动式和数据库SQL脱敏,
    2025-12-12
  • 深入浅析JDK8新特性之Lambda表达式

    深入浅析JDK8新特性之Lambda表达式

    Lambda表达式主要是替换了原有匿名内部类的写法,也就是简化了匿名内部类的写法。这篇文章主要介绍了JDK8新特性之Lambda表达式,非常不错感兴趣的朋友参考下吧
    2016-10-10
  • Java List集合取交集的五种常见方式总结

    Java List集合取交集的五种常见方式总结

    在Java中取两个List集合的交集可以通过多种方式实现,下面这篇文章主要给大家介绍了关于Java List集合取交集的五种常见方式,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • java获取当前时间戳的方法

    java获取当前时间戳的方法

    本文主要介绍了java获取当前时间戳的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Java流程控制顺序结构原理解析

    Java流程控制顺序结构原理解析

    这篇文章主要介绍了Java流程控制顺序结构原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • SpringSecurity中的EnableWebSecurity注解启用Web安全详解

    SpringSecurity中的EnableWebSecurity注解启用Web安全详解

    这篇文章主要介绍了SpringSecurity中的EnableWebSecurity注解启用Web安全详解,@EnableWebSecurity是Spring Security用于启用Web安全的注解,典型的用法是该注解用在某个Web安全配置类上,实现了接口,需要的朋友可以参考下
    2023-12-12
  • 升级springboot3.x踩坑记录

    升级springboot3.x踩坑记录

    本文主要介绍了升级springboot3.x踩坑记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05

最新评论