版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第Java實現(xiàn)驗證文件名有效性的方法詳解目錄使用java.io.File使用NIO2API自定義的實現(xiàn)使用String.contains正則表達式模式匹配總結在本文中,我們將討論使用Java驗證一個給定的字符串是否具有操作系統(tǒng)的有效文件名的不同方法。我們可以根據(jù)限制的字符或長度限制來檢查該值。
我們將只關注核心解決方案,不使用任何外部依賴。我們將使用JDK的java.io和NIO2包來實現(xiàn)我們驗證方法。。
使用java.io.File
讓我們從第一個例子開始,使用java.io.File類。在這個解決方案中,我們需要用一個給定的字符串創(chuàng)建一個File實例,然后在本地磁盤上創(chuàng)建一個文件。
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。讓我們注意,由于里面的文件創(chuàng)建,這個方法需要給定的文件名字符串沒有對應存在的文件。
我們知道,不同的文件系統(tǒng)有自己的文件名限制。通過使用java.io.File方法,我們不需要指定每個操作系統(tǒng)的規(guī)則,因為Java自動為我們解決了這個問題。
然而,我們需要創(chuàng)建一個假文件。當我們成功后,我們必須記得在最后刪除它。此外,我們必須確保我們有適當?shù)臋嘞迊韴?zhí)行這些操作。任何失敗也可能導致IOException,所以也最好檢查一下錯誤信息。
assertThatThrownBy(()
-
validateStringFilenameUsingIO("javanorth.txt"))
.isInstanceOf(IOException.class)
.hasMessageContaining("Invalid
file
path");
使用NIO2API
我們知道java.io包有很多缺點,因為它是在Java的第一個版本中創(chuàng)建的。NIO2API是java.io包的后繼者,它帶來了許多改進,這也大大簡化了我們之前的解決方案。
public
static
boolean
validateStringFilenameUsingNIO2(String
filename)
{
Paths.get(filename);
return
true;
我們的功能現(xiàn)在被精簡了,所以它是進行這種測試的最快方式。我們不創(chuàng)建任何文件,所以我們不需要有任何磁盤權限,也不需要在測試后執(zhí)行清理。
無效的文件名拋出nvalidPathException,它擴展了RuntimeException。這個的錯誤信息也包含了比之前更多的細節(jié)。
assertThatThrownBy(()
-
validateStringFilenameUsingNIO2(filename))
.isInstanceOf(InvalidPathException.class)
.hasMessageContaining("character
not
allowed");
但是這個解決方案有一個嚴重的缺點,與文件系統(tǒng)的限制有關。Path類可能表示帶有子目錄的文件路徑。與第一個例子不同,這個方法沒有檢查文件名字符的溢出限制。讓我們用ApacheCommons的randomAlphabetic()方法生成的五百個字符的隨機String來檢查。
String
filename
=
RandomStringUtils.randomAlphabetic(500);
assertThatThrownBy(()
-
validateStringFilenameUsingIO(filename))
.isInstanceOf(IOException.class)
.hasMessageContaining("File
name
too
long");
assertThat(validateStringFilenameUsingNIO2(filename)).isTrue();
為了解決這個問題,我們應該像以前一樣,創(chuàng)建一個文件并檢查結果。
自定義的實現(xiàn)
最后,讓我們嘗試實現(xiàn)我們自己的自定義函數(shù)來測試文件名。我們還將嘗試避免任何I/O功能,只使用核心的Java方法。
這類解決方案提供了更多的控制權,允許我們實現(xiàn)我們自己的規(guī)則。然而,我們必須考慮不同系統(tǒng)的許多額外限制。
使用String.contains
我們可以使用String.contains()方法來檢查給定的String是否包含任何禁止的字符。首先,我們需要手動指定一些示例值。
public
static
final
Character[]
INVALID_WINDOWS_SPECIFIC_CHARS
=
{'"',
'`',
'',
'',
'',
'|'};
public
static
final
Character[]
INVALID_UNIX_SPECIFIC_CHARS
=
{'\000'};
在我們的例子中,讓我們只關注這兩個操作系統(tǒng),Windows的文件名比UNIX的限制更多。另外,一些的空白字符可能會有問題。
在定義了受限制的字符集之后,讓我們來確定當前的操作系統(tǒng)。
public
static
Character[]
getInvalidCharsByOS()
{
String
os
=
System.getProperty("").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[]{};
}
而現(xiàn)在我們可以用它來測試給定的值。
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謂詞返回真。此外,我們還實現(xiàn)了對null值和不正確長度的支持。
正則表達式模式匹配
我們也可以在給定的String上直接使用正則表達式。讓我們來實現(xiàn)一個只接受字母數(shù)字和點字符的模式,其長度不超過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);
現(xiàn)在,我們可以根據(jù)先前準備的模式測試給定的值。我們還可以輕松地修改模式。在這個例子中,我們跳過了操作系統(tǒng)的檢查功能。
總結
在
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年計算機軟件工程基礎理論與操作題庫
- 2026年國際商務英語考試模擬題與答案詳解
- 2026年河南經(jīng)貿(mào)職業(yè)學院單招職業(yè)傾向性考試題庫必考題
- 2026年廣東省河源市單招職業(yè)適應性考試題庫附答案
- 2026年企業(yè)管理精要企業(yè)戰(zhàn)略與運營管理題庫
- 2026年企業(yè)市場開拓與創(chuàng)新策略研究問題集
- 2026年經(jīng)濟學基礎知識及論述題集
- 2026年新零售商業(yè)模式與創(chuàng)新發(fā)展題目解析
- 2026年網(wǎng)絡安全與數(shù)據(jù)保護知識問答
- 2026年職業(yè)資格考試綜合題型解讀與實戰(zhàn)訓練
- 衛(wèi)生管理研究論文
- 2025-2026學年人教版(新教材)小學數(shù)學二年級下冊(全冊)教學設計(附教材目錄P161)
- 委托市場調研合同范本
- 畜牧安全培訓資料課件
- 2025年度黨支部書記述職報告
- 2026四川省引大濟岷水資源開發(fā)限公司公開招聘易考易錯模擬試題(共500題)試卷后附參考答案
- 2026年安徽糧食工程職業(yè)學院高職單招職業(yè)適應性考試備考試題及答案詳解
- 內科學總論小兒遺傳代謝病課件
- 雨課堂學堂在線學堂云《中國電影經(jīng)典影片鑒賞(北京師范大學)》單元測試考核答案
- 核電站防地震應急方案
- 2025江西江新造船有限公司招聘70人模擬筆試試題及答案解析
評論
0/150
提交評論