最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java獲取文件后綴名的方法小結(jié)

 更新時(shí)間:2025年05月21日 09:59:08   作者:李少兄  
在Java開發(fā)中,尤其是Web應(yīng)用或文件處理場(chǎng)景中,獲取文件后綴名是一個(gè)高頻需求,無論是文件上傳驗(yàn)證、類型過濾、格式校驗(yàn),還是日志記錄,后綴名的正確提取都是核心基礎(chǔ),本文給大家介紹了Java獲取文件后綴名的方法,需要的朋友可以參考下

前言

在Java開發(fā)中,尤其是Web應(yīng)用或文件處理場(chǎng)景中,獲取文件后綴名是一個(gè)高頻需求。無論是文件上傳驗(yàn)證、類型過濾、格式校驗(yàn),還是日志記錄,后綴名的正確提取都是核心基礎(chǔ)。

1. 基礎(chǔ)方法:lastIndexOf + substring

定義:通過定位最后一個(gè) . 的位置,截取后綴名。

入?yún)?/strong>: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();
}

執(zhí)行效果

  • 文件名 report_v2.2023.xlsx → 返回 xlsx
  • 文件名 image. → 返回空字符串
  • 文件名 .gitignore → 返回 gitignore

2. 字符串分割:split 方法

定義:通過 . 分割文件名,取最后一個(gè)元素。

入?yún)?/strong>: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() : "";
}

執(zhí)行效果

  • 文件名 archive.v1.7z → 返回 7z
  • 文件名 file → 返回空字符串

3. 正則表達(dá)式

定義:通過正則匹配最后一個(gè) . 后的字符串。

入?yún)?/strong>: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() : "";
}

執(zhí)行效果

  • 文件名 document.pdf → 返回 pdf
  • 文件名 file.tar.gz → 返回 gz

4. Apache Commons IO 的 FilenameUtils

定義:使用 Apache Commons IO 的工具類。

入?yún)?/strong>: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();
}

執(zhí)行效果

  • 文件名 file.txt → 返回 txt
  • 文件名 file. → 返回空字符串

5. Spring框架的 StringUtils

定義:使用 Spring 的工具類。

入?yún)?/strong>: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);
}

執(zhí)行效果

  • 文件名 image.jpg → 返回 jpg
  • 返回值為 null 時(shí)需注意空指針(如 file 無擴(kuò)展名)。

6. 使用 File 類

定義:通過構(gòu)造 File 對(duì)象提取文件名。

入?yún)?/strong>: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() 
        : "";
}

執(zhí)行效果

  • 文件名 data.csv → 返回 csv
  • 文件名 config. → 返回空字符串

7. Java NIO的 Paths 類

定義:通過 java.nio.file 包處理路徑。

入?yún)?/strong>: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();
}

執(zhí)行效果

  • 文件名 report.pdf → 返回 pdf
  • 跨平臺(tái)兼容性好(如路徑 /home/file.txt → 提取 txt)。

8. 結(jié)合MIME類型驗(yàn)證

定義:通過 MultipartFile.getContentType() 驗(yàn)證后綴。

入?yún)?/strong>:MultipartFile file

???????依賴:無

代碼示例

public static boolean validateFile(MultipartFile file) {
    String ext = getExtension(file); // 使用上述任意方法
    String contentType = file.getContentType();
    return ext.equals("jpg") && contentType.equals("image/jpeg");
}

執(zhí)行效果

  • 文件名 image.jpg 且 MIME 為 image/jpeg → 返回 true
  • 文件名 image.png 但 MIME 為 image/jpeg → 返回 false

9. 自定義枚舉過濾

定義:通過枚舉限定允許的后綴。

入?yún)?/strong>: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 : "";
}

執(zhí)行效果

  • 文件名 photo.jpg → 返回 jpg
  • 文件名 image.bmp → 返回空字符串

10. 使用Lombok的 @Cleanup 簡化代碼

定義:通過 Lombok 減少資源管理代碼。

入?yún)?/strong>: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();
    // 其他邏輯(如讀取文件內(nèi)容)
    return "ext"; // 示例返回值
}

執(zhí)行效果

  • 自動(dòng)關(guān)閉 inputStream,無需手動(dòng)管理資源。

方法對(duì)比表

方法依賴邊界處理性能適用場(chǎng)景
lastIndexOf + substring完善(需手動(dòng)處理)簡單場(chǎng)景,無依賴要求
split簡單(需數(shù)組長度判斷)快速實(shí)現(xiàn),無特殊需求
正則表達(dá)式靈活(正則可擴(kuò)展)需復(fù)雜匹配時(shí)
Apache Commons IOcommons-io自動(dòng)處理需多文件操作功能
Spring StringUtilsspring-core自動(dòng)處理Spring生態(tài)內(nèi)使用
File 類基礎(chǔ)需路徑處理時(shí)
Java NIO Paths基礎(chǔ)現(xiàn)代API,跨平臺(tái)需求
MIME類型驗(yàn)證依賴MIME類型安全驗(yàn)證場(chǎng)景

最佳實(shí)踐建議

  1. 依賴選擇

    • 零依賴場(chǎng)景:優(yōu)先使用 lastIndexOf 或 split。
    • 復(fù)雜需求:使用 Apache Commons IO 或 Spring 的 StringUtils。
  2. 邊界情況處理

    • 文件名以 . 開頭(如 .gitignore):返回后綴 gitignore。
    • 文件名無擴(kuò)展名(如 file):返回空字符串。
    • 文件名以 . 結(jié)尾(如 file.):返回空字符串。
  3. 后綴統(tǒng)一小寫

    • 使用 toLowerCase() 避免大小寫敏感問題(如 JPG → jpg)。
  4. 安全驗(yàn)證

    • 結(jié)合MIME類型與后綴雙重校驗(yàn)(如 image/jpeg 與 jpg)。

總結(jié)

針對(duì) MultipartFile 的后綴名獲取,選擇需結(jié)合項(xiàng)目需求:

  • 基礎(chǔ)場(chǎng)景:推薦 lastIndexOf 或 Apache Commons IO。
  • Spring生態(tài):直接使用 StringUtils.getFilenameExtension。
  • 安全敏感場(chǎng)景:結(jié)合MIME類型驗(yàn)證。

以上就是Java獲取文件后綴名的方法小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于Java獲取文件后綴名的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Mybatis自定義typeHandle過程解析

    Mybatis自定義typeHandle過程解析

    這篇文章主要介紹了Mybatis自定義typeHandle過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java?Spring?事件監(jiān)聽詳情解析

    Java?Spring?事件監(jiān)聽詳情解析

    這篇文章主要介紹了Java?Spring?事件監(jiān)聽詳情解析,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • Java線程池獲取池中所有線程列表的方法總結(jié)

    Java線程池獲取池中所有線程列表的方法總結(jié)

    在Java中,獲取線程池中所有線程列表并不是一個(gè)直接支持的功能,因?yàn)榫€程池的設(shè)計(jì)通常是為了隱藏和管理底層的線程細(xì)節(jié),從而提供更高層次的抽象和并發(fā)控制能力,本文給大家介紹了Java線程池獲取池中所有線程列表的方法,需要的朋友可以參考下
    2024-10-10
  • SpringBoot常用脫敏方案小結(jié)

    SpringBoot常用脫敏方案小結(jié)

    本文系統(tǒng)分析了四種主流數(shù)據(jù)脫敏技術(shù)方案,包括Jackson注解式、AOP攔截式、DTO手動(dòng)式和數(shù)據(jù)庫SQL脫敏,
    2025-12-12
  • 深入淺析JDK8新特性之Lambda表達(dá)式

    深入淺析JDK8新特性之Lambda表達(dá)式

    Lambda表達(dá)式主要是替換了原有匿名內(nèi)部類的寫法,也就是簡化了匿名內(nèi)部類的寫法。這篇文章主要介紹了JDK8新特性之Lambda表達(dá)式,非常不錯(cuò)感興趣的朋友參考下吧
    2016-10-10
  • Java?List集合取交集的五種常見方式總結(jié)

    Java?List集合取交集的五種常見方式總結(jié)

    在Java中取兩個(gè)List集合的交集可以通過多種方式實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于Java?List集合取交集的五種常見方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • java獲取當(dāng)前時(shí)間戳的方法

    java獲取當(dāng)前時(shí)間戳的方法

    本文主要介紹了java獲取當(dāng)前時(shí)間戳的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Java流程控制順序結(jié)構(gòu)原理解析

    Java流程控制順序結(jié)構(gòu)原理解析

    這篇文章主要介紹了Java流程控制順序結(jié)構(gòu)原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • SpringSecurity中的EnableWebSecurity注解啟用Web安全詳解

    SpringSecurity中的EnableWebSecurity注解啟用Web安全詳解

    這篇文章主要介紹了SpringSecurity中的EnableWebSecurity注解啟用Web安全詳解,@EnableWebSecurity是Spring?Security用于啟用Web安全的注解,典型的用法是該注解用在某個(gè)Web安全配置類上,實(shí)現(xiàn)了接口,需要的朋友可以參考下
    2023-12-12
  • 升級(jí)springboot3.x踩坑記錄

    升級(jí)springboot3.x踩坑記錄

    本文主要介紹了升級(jí)springboot3.x踩坑記錄,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05

最新評(píng)論

旺苍县| 互助| 荃湾区| 长沙市| 玉门市| 衡水市| 高碑店市| 江山市| 新绛县| 湘潭市| 华容县| 响水县| 阿尔山市| 阜城县| 红河县| 云阳县| 崇礼县| 保山市| 周宁县| 澎湖县| 东平县| 壶关县| 商城县| 班戈县| 延津县| 沾益县| 财经| 新巴尔虎左旗| 哈密市| 乐亭县| 饶阳县| 石城县| 乐山市| 澄迈县| 镇坪县| 右玉县| 乌海市| 牡丹江市| 松滋市| 兴国县| 邵武市|