成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java 如何驗證文件名的有效性?

開發 前端
我們從java.io包開始,它為我們解決了大部分的系統限制,但執行了額外的I/O動作,可能需要一些權限。然后我們檢查了NIO2 API,它是最快的解決方案,但有文件名長度檢查的限制。

大家好,我是指北君。

在本文中,我們將討論使用 Java 驗證一個給定的字符串是否具有操作系統的有效文件名的不同方法。我們可以根據限制的字符或長度限制來檢查該值。

我們將只關注核心解決方案,不使用任何外部依賴。我們將使用JDK的java.io和NIO2包來實現我們驗證方法。。

使用java.io.File

讓我們從第一個例子開始,使用 java.io.File 類。在這個解決方案中,我們需要用一個給定的字符串創建一個File實例,然后在本地磁盤上創建一個文件。

public static boolean validateStringFilenameUsingIO(String filename) throws IOException {
File file = new File(filename);
boolean created = false;
try {
created = file.createNewFile();
return created;
} finally {
if (created) {
file.delete();
}
}
}

當給定的文件名不正確時,它會拋出一個IOException。讓我們注意,由于里面的文件創建,這個方法需要給定的文件名字符串沒有對應存在的文件。

我們知道,不同的文件系統有自己的文件名限制。通過使用 java.io.File 方法,我們不需要指定每個操作系統的規則,因為Java自動為我們解決了這個問題。

然而,我們需要創建一個假文件。當我們成功后,我們必須記得在最后刪除它。此外,我們必須確保我們有適當的權限來執行這些操作。任何失敗也可能導致IOException,所以也最好檢查一下錯誤信息。

assertThatThrownBy(() -> validateStringFilenameUsingIO("javanorth?.txt"))
.isInstanceOf(IOException.class)
.hasMessageContaining("Invalid file path");

使用 NIO2 API

我們知道java.io包有很多缺點,因為它是在Java的第一個版本中創建的。NIO2 API是java.io包的后繼者,它帶來了許多改進,這也大大簡化了我們之前的解決方案。

public static boolean validateStringFilenameUsingNIO2(String filename) {
Paths.get(filename);
return true;
}

我們的功能現在被精簡了,所以它是進行這種測試的最快方式。我們不創建任何文件,所以我們不需要有任何磁盤權限,也不需要在測試后執行清理。

無效的文件名拋出 nvalidPathException,它擴展了RuntimeException。這個的錯誤信息也包含了比之前更多的細節。

assertThatThrownBy(() -> validateStringFilenameUsingNIO2(filename))
.isInstanceOf(InvalidPathException.class)
.hasMessageContaining("character not allowed");

但是這個解決方案有一個嚴重的缺點,與文件系統的限制有關。Path類可能表示帶有子目錄的文件路徑。與第一個例子不同,這個方法沒有檢查文件名字符的溢出限制。讓我們用Apache Commons的randomAlphabetic()方法生成的五百個字符的隨機String來檢查。

String filename = RandomStringUtils.randomAlphabetic(500);
assertThatThrownBy(() -> validateStringFilenameUsingIO(filename))
.isInstanceOf(IOException.class)
.hasMessageContaining("File name too long");

assertThat(validateStringFilenameUsingNIO2(filename)).isTrue();

為了解決這個問題,我們應該像以前一樣,創建一個文件并檢查結果。

自定義的實現

最后,讓我們嘗試實現我們自己的自定義函數來測試文件名。我們還將嘗試避免任何I/O功能,只使用核心的Java方法。

這類解決方案提供了更多的控制權,允許我們實現我們自己的規則。然而,我們必須考慮不同系統的許多額外限制。

使用String.contains

我們可以使用String.contains()方法來檢查給定的String是否包含任何禁止的字符。首先,我們需要手動指定一些示例值。

public static final Character[] INVALID_WINDOWS_SPECIFIC_CHARS = {'"', '`', '<', '>', '?', '|'};
public static final Character[] INVALID_UNIX_SPECIFIC_CHARS = {'\000'};

在我們的例子中,讓我們只關注這兩個操作系統,Windows的文件名比UNIX的限制更多。另外,一些的空白字符可能會有問題。

在定義了受限制的字符集之后,讓我們來確定當前的操作系統。

public static Character[] getInvalidCharsByOS() {
String os = System.getProperty("os.name").toLowerCase();
if (os.contains("win")) {
return INVALID_WINDOWS_SPECIFIC_CHARS;
} else if (os.contains("nix") || os.contains("nux") || os.contains("mac")) {
return INVALID_UNIX_SPECIFIC_CHARS;
} else {
return new Character[]{};
}
}

而現在我們可以用它來測試給定的值。

public static boolean validateStringFilenameUsingContains(String filename) {
if (filename == null || filename.isEmpty() || filename.length() > 255) {
return false;
}
return Arrays.stream(getInvalidCharsByOS())
.noneMatch(ch -> filename.contains(ch.toString()));
}

如果我們定義的任何字符不在給定的文件名中,這個Stream謂詞返回真。此外,我們還實現了對null值和不正確長度的支持。

正則表達式模式匹配

我們也可以在給定的String上直接使用正則表達式。讓我們來實現一個只接受字母數字和點字符的模式,其長度不超過255。

public static final String REGEX_PATTERN = "^[A-za-z0-9.]{1,255}$";

public static boolean validateStringFilenameUsingRegex(String filename) {
if (filename == null) {
return false;
}
return filename.matches(REGEX_PATTERN);
}

現在,我們可以根據先前準備的模式測試給定的值。我們還可以輕松地修改模式。在這個例子中,我們跳過了操作系統的檢查功能。

總結

在這篇文章中,我們集中討論了文件名及其限制。我們介紹了不同的算法,用Java檢測無效的文件名。

我們從java.io包開始,它為我們解決了大部分的系統限制,但執行了額外的I/O動作,可能需要一些權限。然后我們檢查了NIO2 API,它是最快的解決方案,但有文件名長度檢查的限制。

最后,我們實現了我們自己的方法,不使用任何I/O API,但需要自定義實現文件系統規則。

責任編輯:武曉燕 來源: Java技術指北
相關推薦

2024-07-09 07:54:26

2023-09-05 07:17:23

2021-03-08 10:48:04

AI

2023-12-08 16:32:35

GenAI人工智能AI

2010-07-19 15:07:23

SQL Server評

2025-05-21 09:43:26

2009-06-29 09:57:05

Unix

2021-09-07 06:40:26

狀態機識別地址

2015-03-24 11:04:58

2016-07-26 11:21:53

2023-07-03 09:49:49

2012-12-24 15:00:56

sis塞班

2024-07-08 08:18:45

2010-04-30 16:24:51

2010-07-28 16:40:38

2023-06-06 12:11:51

2021-03-16 12:42:42

FreeDOS開源

2012-10-09 16:37:20

FastDFS

2018-03-28 17:51:24

LinuxUnix

2018-12-18 17:45:59

數據庫數據庫安全
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一级淫片免费视频黄 | 亚洲中午字幕 | 久久久天堂| 日本超碰 | 一级日韩 | 日韩欧美在线观看视频 | 都市激情亚洲 | 欧美成人a∨高清免费观看 老司机午夜性大片 | 久久久久国产一级毛片高清网站 | 成年无码av片在线 | 国产又爽又黄的视频 | 国产精品1区2区3区 男女啪啪高潮无遮挡免费动态 | 亚洲狠狠丁香婷婷综合久久久 | 成人在线视频网站 | 亚洲欧洲精品一区 | 拍拍无遮挡人做人爱视频免费观看 | 成人综合视频在线 | 成人久久18免费网站麻豆 | 日韩久久久久 | 久久久久国产精品午夜一区 | 国产视频久久 | 精品国产欧美在线 | 欧美lesbianxxxxhd视频社区 | 国产一区二区电影网 | 无码一区二区三区视频 | a级大片| 毛片网在线观看 | www.四虎.com | 国产精品 欧美精品 | 中文字幕 在线观看 | 中文字幕亚洲欧美日韩在线不卡 | 天天久 | 国产精品日日做人人爱 | 国产精品网址 | 亚洲精品视频免费 | 亚洲福利在线视频 | 国产精品五区 | 国产综合av | 99色视频| 国产精品综合 | 亚洲二区在线 |