Java獲取文件后綴名的方法小結(jié)
前言
在Java開發(fā)中,尤其是Web應(yīng)用或文件處理場景中,獲取文件后綴名是一個高頻需求。無論是文件上傳驗證、類型過濾、格式校驗,還是日志記錄,后綴名的正確提取都是核心基礎(chǔ)。
1. 基礎(chǔ)方法:lastIndexOf + substring
定義:通過定位最后一個 .
的位置,截取后綴名。
入?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 方法
定義:通過 .
分割文件名,取最后一個元素。
入?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. 正則表達式
定義:通過正則匹配最后一個 .
后的字符串。
入?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
時需注意空指針(如file
無擴展名)。
6. 使用 File 類
定義:通過構(gòu)造 File
對象提取文件名。
入?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
- 跨平臺兼容性好(如路徑
/home/file.txt
→ 提取txt
)。
8. 結(jié)合MIME類型驗證
定義:通過 MultipartFile.getContentType()
驗證后綴。
入?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í)行效果:
- 自動關(guān)閉
inputStream
,無需手動管理資源。
方法對比表
方法 | 依賴 | 邊界處理 | 性能 | 適用場景 |
---|---|---|---|---|
lastIndexOf + substring | 無 | 完善(需手動處理) | 高 | 簡單場景,無依賴要求 |
split | 無 | 簡單(需數(shù)組長度判斷) | 中 | 快速實現(xiàn),無特殊需求 |
正則表達式 | 無 | 靈活(正則可擴展) | 中 | 需復(fù)雜匹配時 |
Apache Commons IO | commons-io | 自動處理 | 高 | 需多文件操作功能 |
Spring StringUtils | spring-core | 自動處理 | 高 | Spring生態(tài)內(nèi)使用 |
File 類 | 無 | 基礎(chǔ) | 中 | 需路徑處理時 |
Java NIO Paths | 無 | 基礎(chǔ) | 中 | 現(xiàn)代API,跨平臺需求 |
MIME類型驗證 | 無 | 依賴MIME類型 | 高 | 安全驗證場景 |
最佳實踐建議
依賴選擇:
- 零依賴場景:優(yōu)先使用
lastIndexOf
或split
。 - 復(fù)雜需求:使用 Apache Commons IO 或 Spring 的
StringUtils
。
- 零依賴場景:優(yōu)先使用
邊界情況處理:
- 文件名以
.
開頭(如.gitignore
):返回后綴gitignore
。 - 文件名無擴展名(如
file
):返回空字符串。 - 文件名以
.
結(jié)尾(如file.
):返回空字符串。
- 文件名以
后綴統(tǒng)一小寫:
- 使用
toLowerCase()
避免大小寫敏感問題(如JPG
→jpg
)。
- 使用
安全驗證:
- 結(jié)合MIME類型與后綴雙重校驗(如
image/jpeg
與jpg
)。
- 結(jié)合MIME類型與后綴雙重校驗(如
總結(jié)
針對 MultipartFile
的后綴名獲取,選擇需結(jié)合項目需求:
- 基礎(chǔ)場景:推薦
lastIndexOf
或 Apache Commons IO。 - Spring生態(tài):直接使用
StringUtils.getFilenameExtension
。 - 安全敏感場景:結(jié)合MIME類型驗證。
以上就是Java獲取文件后綴名的方法小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于Java獲取文件后綴名的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決mybatis-generator生成Mapper文件沒有Selective結(jié)尾的問題
這篇文章主要介紹了解決mybatis-generator生成Mapper文件沒有Selective結(jié)尾的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09Java發(fā)送郵件javax.mail的實現(xiàn)方法
這篇文章主要為大家介紹了Java發(fā)送郵件javax.mail的實現(xiàn)方法,具有一定的參考價值,代碼都有詳細(xì)的注釋,感興趣的小伙伴們可以參考一下2016-01-01mybatis修改int型數(shù)據(jù)無法修改成0的解決
這篇文章主要介紹了mybatis修改int型數(shù)據(jù)無法修改成0的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09解決springboot報錯Failed?to?parse?multipart?servlet?request
在使用SpringBoot開發(fā)時,通過Postman發(fā)送POST請求,可能會遇到因臨時目錄不存在而導(dǎo)致的MultipartException異常,這通常是因為OS系統(tǒng)(如CentOS)定期刪除/tmp目錄下的臨時文件,解決方案包括重啟項目2024-10-10ActiveMQ結(jié)合Spring收發(fā)消息的示例代碼
這篇文章主要介紹了ActiveMQ結(jié)合Spring收發(fā)消息的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10Java?從json提取數(shù)組并轉(zhuǎn)換為list的操作方法
這篇文章主要介紹了Java?從json提取出數(shù)組并轉(zhuǎn)換為list,使用getJSONArray()獲取到j(luò)sonarray后,再將jsonArray轉(zhuǎn)換為字符串,最后將字符串解析為List列表,本文通過實例代碼給大家詳細(xì)講解,需要的朋友可以參考下2022-10-10Java動態(tài)數(shù)組ArrayList實現(xiàn)動態(tài)原理
ArrayList是一種動態(tài)數(shù)組,它可以在運行時自動調(diào)整大小以適應(yīng)元素的添加和刪除,在Java中,你可以使用ArrayList類來實現(xiàn)動態(tài)數(shù)組,本文將給大家介紹一下ArrayList動態(tài)數(shù)組,是怎么實現(xiàn)動態(tài)的2023-08-08