<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Java不同的算法

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-10-08 11:43 ? 次閱讀

在本文中,我們將討論使用 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 = {'?00'};

在我們的例子中,讓我們只關注這兩個操作系統,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,但需要自定義實現文件系統規則。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 操作系統
    +關注

    關注

    37

    文章

    6363

    瀏覽量

    122122
  • JAVA
    +關注

    關注

    19

    文章

    2909

    瀏覽量

    103199
  • API
    API
    +關注

    關注

    2

    文章

    1416

    瀏覽量

    61122
  • 文件
    +關注

    關注

    1

    文章

    540

    瀏覽量

    24454
收藏 人收藏

    評論

    相關推薦

    數據結構與算法分析(Java版)(pdf)

    數據結構與算法分析(Java版)(pdf)http://www.ibeifeng.com/read.php?tid=4812&u=73481【中文】Java數據結構和算法中文第
    發表于 12-20 21:22

    JAVA算法大全

    歡迎多來分享,一起學習交流
    發表于 05-28 12:40

    Hanlp分詞實例:Java實現TFIDF算法

    算法介紹最近要做領域概念的提取,TFIDF作為一個很經典的算法可以作為其中的一步處理。關于TFIDF算法的介紹可以參考這篇博客【http://www】.ruanyifeng.com/blog
    發表于 11-14 10:03

    史上最全面Java面試匯總(面試題+答案)精選資料分享

    JAVA面試精選【Java基礎第一部分】JAVA面試精選【Java基礎第二部分】JAVA面試精選【Jav
    發表于 07-21 09:39

    Linux系統接口編程

    知識圖譜大學課程數字邏輯計算機組成原理匯編語言編譯原理操作系統計算機網絡高級語言(C、C++、Java算法與數據結構數據庫面向對象方法軟件工程自學內容ARM 指令集、體系架構ARM 外設Linux 內核、驅動Linux 系統接口編程Linux 網絡編程Qt ...
    發表于 11-04 08:02

    JAVA語言的工具類與算法

    JAVA語言的工具類與算法6.1 語言基礎類庫;            
    發表于 12-14 20:34 ?66次下載

    JAVA語言實現RSA公鑰密碼算法

    JAVA語言實現RSA公鑰密碼算法:本文闡述了公開密鑰密碼體制RSA算法的原理及實現技術。并在此基礎上,給出了JAVA語言實現的RSA算法
    發表于 02-10 10:27 ?58次下載

    中國農歷算法java實現

    /**  * 中國農歷算法 - 實用于公歷 1901 年至 2100 年之間的 200 年  */import java.text.*;import java.util.*;class ChineseCalendarGB {  
    發表于 12-30 17:53 ?23次下載

    Java數組與算法試題

    Java數組與算法試題Java數組與算法試題Java數組與算法試題
    發表于 01-15 16:16 ?0次下載

    40道經典JAVA算法題和解答

    本文檔的主要內容詳細介紹的是40道經典JAVA算法題和解答。
    發表于 07-02 08:00 ?0次下載
    40道經典<b class='flag-5'>JAVA</b><b class='flag-5'>算法</b>題和解答

    安裝包是7.apk,要求獲取flag

    通過分析java算法,判斷輸入是否正確。 如下是該APK算法部分的核心代碼,密碼主要是年月日+m數組某成員組成的字符串,經過如下a函數運算處理,如果最終運算結果等于34,則驗證成功。 下面主要通過解讀
    的頭像 發表于 09-26 10:09 ?2898次閱讀
    安裝包是7.apk,要求獲取flag

    數據結構與算法分析——Java語言描述

    數據結構與算法分析——Java語言描述說明。
    發表于 05-31 14:25 ?22次下載

    Java智能卡EEPROM碎片整理算法

    Java智能卡EEPROM碎片整理算法(c語言嵌入式開發需要學的東西)-Java智能卡EEPROM碎片整理算法
    發表于 07-30 11:34 ?9次下載
    <b class='flag-5'>Java</b>智能卡EEPROM碎片整理<b class='flag-5'>算法</b>

    嵌入式 Linux 應用程序開發概覽

    這是我給公司研發部同事的一個分享培訓課程,把內容大綱分享出來。知識圖譜大學課程數字邏輯 計算機組成原理 匯編語言 編譯原理 操作系統 計算機網絡 高級語言(C、C++、Java算法與數據結構
    發表于 11-01 17:21 ?8次下載
    嵌入式 Linux 應用程序開發概覽

    Java算法大全源碼包開源源碼

    Java算法大全源碼包開源源碼
    發表于 06-07 14:58 ?1次下載
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>