欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實(shí)現(xiàn)驗(yàn)證文件名有效性的方法詳解

 更新時(shí)間:2022年09月28日 08:34:16   作者:指北君  
在本文中,我們將討論使用?Java?驗(yàn)證一個(gè)給定的字符串是否具有操作系統(tǒng)的有效文件名的不同方法,文中的示例代碼講解詳細(xì),感興趣的可以了解一下

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

我們將只關(guān)注核心解決方案,不使用任何外部依賴。我們將使用JDK的java.io和NIO2包來實(shí)現(xiàn)我們驗(yàn)證方法。。

使用java.io.File

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

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();
????????}
????}
}

當(dāng)給定的文件名不正確時(shí),它會(huì)拋出一個(gè)IOException。讓我們注意,由于里面的文件創(chuàng)建,這個(gè)方法需要給定的文件名字符串沒有對應(yīng)存在的文件。

我們知道,不同的文件系統(tǒng)有自己的文件名限制。通過使用 java.io.File 方法,我們不需要指定每個(gè)操作系統(tǒng)的規(guī)則,因?yàn)镴ava自動(dòng)為我們解決了這個(gè)問題。

然而,我們需要?jiǎng)?chuàng)建一個(gè)假文件。當(dāng)我們成功后,我們必須記得在最后刪除它。此外,我們必須確保我們有適當(dāng)?shù)臋?quán)限來執(zhí)行這些操作。任何失敗也可能導(dǎo)致IOException,所以也最好檢查一下錯(cuò)誤信息。

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

使用 NIO2 API

我們知道java.io包有很多缺點(diǎn),因?yàn)樗窃贘ava的第一個(gè)版本中創(chuàng)建的。NIO2 API是java.io包的后繼者,它帶來了許多改進(jìn),這也大大簡化了我們之前的解決方案。

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

我們的功能現(xiàn)在被精簡了,所以它是進(jìn)行這種測試的最快方式。我們不創(chuàng)建任何文件,所以我們不需要有任何磁盤權(quán)限,也不需要在測試后執(zhí)行清理。

無效的文件名拋出 nvalidPathException,它擴(kuò)展了RuntimeException。這個(gè)的錯(cuò)誤信息也包含了比之前更多的細(xì)節(jié)。

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

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

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

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

為了解決這個(gè)問題,我們應(yīng)該像以前一樣,創(chuàng)建一個(gè)文件并檢查結(jié)果。

自定義的實(shí)現(xiàn)

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

這類解決方案提供了更多的控制權(quán),允許我們實(shí)現(xiàn)我們自己的規(guī)則。然而,我們必須考慮不同系統(tǒng)的許多額外限制。

使用String.contains

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

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

在我們的例子中,讓我們只關(guān)注這兩個(gè)操作系統(tǒng),Windows的文件名比UNIX的限制更多。另外,一些的空白字符可能會(huì)有問題。

在定義了受限制的字符集之后,讓我們來確定當(dāng)前的操作系統(tǒng)。

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[]{};
????}
}

而現(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()));
}

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

正則表達(dá)式模式匹配

我們也可以在給定的String上直接使用正則表達(dá)式。讓我們來實(shí)現(xiàn)一個(gè)只接受字母數(shù)字和點(diǎn)字符的模式,其長度不超過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ù)先前準(zhǔn)備的模式測試給定的值。我們還可以輕松地修改模式。在這個(gè)例子中,我們跳過了操作系統(tǒng)的檢查功能。

總結(jié)

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

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

最后,我們實(shí)現(xiàn)了我們自己的方法,不使用任何I/O API,但需要自定義實(shí)現(xiàn)文件系統(tǒng)規(guī)則。

到此這篇關(guān)于Java實(shí)現(xiàn)驗(yàn)證文件名有效性的方法詳解的文章就介紹到這了,更多相關(guān)Java驗(yàn)證文件名內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)數(shù)獨(dú)小游戲

    Java實(shí)現(xiàn)數(shù)獨(dú)小游戲

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)數(shù)獨(dú)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • java進(jìn)行error捕獲和處理示例(java異常捕獲)

    java進(jìn)行error捕獲和處理示例(java異常捕獲)

    通常來說,大家都是對Java中的Exception進(jìn)行捕獲和進(jìn)行相應(yīng)的處理,有些人說,error就無法捕獲了。其實(shí),error也是可以捕獲的。Error和Exception都是Throwable的子類。既然可以catch Throwable,那么error也是可以catch的
    2014-01-01
  • java使用Abobe Acrobat DC生成模板

    java使用Abobe Acrobat DC生成模板

    這篇文章主要介紹了java使用Abobe Acrobat DC生成模板,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • 談?wù)劄镴AXB和response設(shè)置編碼,解決wechat4j中文亂碼的問題

    談?wù)劄镴AXB和response設(shè)置編碼,解決wechat4j中文亂碼的問題

    中文亂碼是每個(gè)程序員都會(huì)遇到的問題,本篇文章主要介紹了談?wù)劄镴AXB和response設(shè)置編碼,解決wechat4j中文亂碼的問題,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2016-12-12
  • 關(guān)于SpringBoot創(chuàng)建存儲(chǔ)令牌的媒介類和過濾器的問題

    關(guān)于SpringBoot創(chuàng)建存儲(chǔ)令牌的媒介類和過濾器的問題

    這篇文章主要介紹了SpringBoot創(chuàng)建存儲(chǔ)令牌的媒介類和過濾器的問題,需要在配置文件中,添加JWT需要的密匙,過期時(shí)間和緩存過期時(shí)間,具體實(shí)例代碼參考下本文
    2021-09-09
  • jetty運(yùn)行時(shí)無法保存文件的解決方法

    jetty運(yùn)行時(shí)無法保存文件的解決方法

    這篇文章主要為大家詳細(xì)介紹了jetty運(yùn)行時(shí)無法保存文件的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Mybatis關(guān)聯(lián)查詢結(jié)果集對象嵌套的具體使用

    Mybatis關(guān)聯(lián)查詢結(jié)果集對象嵌套的具體使用

    在查詢時(shí)經(jīng)常出現(xiàn)一對多”的關(guān)系,所有會(huì)出現(xiàn)嵌套對象的情況,本文主要介紹了Mybatis關(guān)聯(lián)查詢結(jié)果集對象嵌套的具體使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • JVM要雙親委派的原因及如何打破它

    JVM要雙親委派的原因及如何打破它

    平時(shí)做業(yè)務(wù)開發(fā)比較少接觸類加載器,但是如果想深入學(xué)習(xí),了解類加載的原理是必不可少的.java的類加載器有哪些?什么是雙親委派?為什么要雙親委派?如何打破它?接下來本文就帶大家詳細(xì)介紹這些知識 ,需要的朋友可以參考下
    2021-06-06
  • Java中的引用類型和使用場景詳細(xì)

    Java中的引用類型和使用場景詳細(xì)

    這篇文章介紹的是Java中的引用類型和使用場景,主要內(nèi)容展開Java中的引用類型,有強(qiáng)引用、軟引用 、弱引用、虛引用,需要的朋友可以參考一下
    2021-10-10
  • SpringCloud Alibaba使用Seata處理分布式事務(wù)的技巧

    SpringCloud Alibaba使用Seata處理分布式事務(wù)的技巧

    在傳統(tǒng)的單體項(xiàng)目中,我們使用@Transactional注解就能實(shí)現(xiàn)基本的ACID事務(wù)了,隨著微服務(wù)架構(gòu)的引入,需要對數(shù)據(jù)庫進(jìn)行分庫分表,每個(gè)服務(wù)擁有自己的數(shù)據(jù)庫,這樣傳統(tǒng)的事務(wù)就不起作用了,那么我們?nèi)绾伪WC多個(gè)服務(wù)中數(shù)據(jù)的一致性呢?跟隨小編一起通過本文了解下吧
    2021-06-06

最新評論