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é)的詳細內(nèi)容,更多關(guān)于Java獲取文件后綴名的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決mybatis-generator生成Mapper文件沒有Selective結(jié)尾的問題
這篇文章主要介紹了解決mybatis-generator生成Mapper文件沒有Selective結(jié)尾的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Java發(fā)送郵件javax.mail的實現(xiàn)方法
這篇文章主要為大家介紹了Java發(fā)送郵件javax.mail的實現(xiàn)方法,具有一定的參考價值,代碼都有詳細的注釋,感興趣的小伙伴們可以參考一下2016-01-01
mybatis修改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-10
ActiveMQ結(jié)合Spring收發(fā)消息的示例代碼
這篇文章主要介紹了ActiveMQ結(jié)合Spring收發(fā)消息的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10
Java?從json提取數(shù)組并轉(zhuǎn)換為list的操作方法
這篇文章主要介紹了Java?從json提取出數(shù)組并轉(zhuǎn)換為list,使用getJSONArray()獲取到j(luò)sonarray后,再將jsonArray轉(zhuǎn)換為字符串,最后將字符串解析為List列表,本文通過實例代碼給大家詳細講解,需要的朋友可以參考下2022-10-10
Java動態(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

