java -- File類和遞歸

来源:https://www.cnblogs.com/paopaoT/archive/2023/04/16/17323917.html
-Advertisement-
Play Games

File類 java.io.File 類是文件和目錄路徑名的抽象表示,主要用於文件和目錄的創建、查找和刪除等操作。File類將文件,文件夾和路徑封裝成了對象,提供大量的方法來操作這些對象。 靜態常量 // 靜態常量 static String pathSeparator // 與系統有關的路徑分隔符 ...


File類

java.io.File 類是文件和目錄路徑名的抽象表示,主要用於文件和目錄的創建、查找和刪除等操作。File類將文件,文件夾和路徑封裝成了對象,提供大量的方法來操作這些對象。

靜態常量

// 靜態常量
static String pathSeparator // 與系統有關的路徑分隔符
	// Window操作系統,分隔符是分號;
	// Linux操作系統,分隔符是冒號:
static String separator // 與系統有關的名稱分隔符
	// Window操作系統,名稱分割符號為 \
	// Linux操作系統,名稱分隔符號為 /

絕對路徑和相對路徑

  • 絕對路徑:從盤符(Windows)或"/"(Linux)開始的路徑,這是一個完整的路徑,絕對路徑具有唯一性
  • 相對路徑:相對於某個目錄的路徑,這是一個便捷的路徑,開發中經常使用,java中寫的相對路徑, 一般都是相對於當前項目
// Windows絕對路徑 Windows
String path1 = "E:\\study\\java\\5_projects\\FileClass\\test";
String path2 = "/opt/html/dist"
// 相對路徑
String path3 = "FileClass\\test";

構造方法

public File(String pathname)
// 通過將給定的路徑名字元串轉換為抽象路徑名來創建新的 File實例
public File(String parent, String child)
// 從父路徑名字元串和子路徑名字元串創建新的 File實例
public File(File parent, String child)
// 從父抽象路徑名和子路徑名字元串創建新的 File實例
// 根據給定的路徑 創建File對象
File file1 = new File("E:\\study\\java\\5_projects\\FileClass\\test");
System.out.println(file1.toString() + "\t " + file1.getPath());
// 傳入字元串的父路徑 和 字元串的子路徑 創建File對象
File file2 = new File("E:\\study\\java\\5_projects\\FileClass","test");
System.out.println(file2);
File file3 = new File("E:\\study\\java\\5_projects","\\FileClass\\test");
System.out.println(file3);
// 傳入File類型的父路徑 和 字元串類型的子路徑
File file4 = new File(file1, "1.txt");
System.out.println(file4);

註意:

  1. 一個File對象代表硬碟中實際存在的一個文件或者目錄。
  2. 無論該路徑下是否存在文件或者目錄,都不影響File對象的創建。

獲取某些屬性

public File getAbsoluteFile() // 獲取絕對路徑(File類型)
public String getAbsolutePath() // 獲取絕對路徑(字元串類型)
public String getPath() // 返回字元串類型的路徑
public String getName() // 獲取文件名
public long length() // 獲取文件位元組數, 不存在返回0
public File getParentFile() //返回File類型的父路徑
public long lastModified() // 返回最後修改時間
// 獲取絕對路徑(字元串類型)
System.out.println("絕對路徑為: " + new File("FileClas\\src").getAbsoluteFile());
System.out.println(file4.getAbsolutePath());
// 獲取絕對路徑(File類型)
System.out.println(file4.getAbsoluteFile());
// 獲取相對路徑下的File對象
File file6 = new File("FileClass" + File.separator + "test" + File.separator + "2.txt");
System.out.println(file6.getAbsolutePath());

// 獲取字元串類型的路徑 直接打引結果相同
// 直接列印(toString)調用了getPath方法
System.out.println(file1.getPath());

// 獲取文件名
System.out.println(new File("FileClass/test/1.txt").getName());

// 獲取文件位元組數, 不存在返回0
long fileLength = new File("FileClass/test/1.txt").length();
System.out.println(fileLength);

// 獲取父路徑, 返回File對象
File parentFile = new File("FileClass/test/1.txt").getParentFile();
System.out.println(parentFile);
System.out.println(parentFile.getParentFile());

// 獲取最後修改時間
long lastModifyTime = new File("FileClass/test/1.txt").lastModified();
System.out.println(lastModifyTime + "\t" + new Date(lastModifyTime));

判斷的方法

public boolean exists()
// 判斷路徑是否存在, 存在返回true

public boolean isFile()
// 判斷是否為文件 文件返回true, 目錄返回false, 路徑不存在也返回false

public boolean isDirectory()
// 判斷是否為目錄, 目錄返回true, 文件返回false, 路徑不存在也返回false
// 判斷路徑是否存在, 存在返回true
System.out.println(new File("FileClass/test/NewDir1").exists());

// 判斷是否為文件 文件返回true, 目錄返回false, 路徑不存在也返回false
System.out.println(file6.isFile());

// 判斷是否為目錄, 目錄返回true, 文件返回false, 路徑不存在也返回false
System.out.println(new File("FileClass/test/NewDir1").isDirectory());

// 因此 判斷某文件是文件/文件夾時 要先判斷路徑是否存在
if (file1.exists()) {
    if(file1.isFile()) {
        System.out.println("文件");
    } else {
        System.out.println("目錄");
    }
} else {
    System.out.println("文件不存在");
}

創建和刪除文件

public boolean createNewFile() throws IOException
// 創建文件, 成功返回true, 存在則不創建
public boolean mkdir()
// 創建單級目錄, 成功返回true, 存在則不創建
public boolean mkdirs()
// 創建單/多級目錄, 成功返回true, 存在則不創建
public boolean delete()
// 刪除文件或空目錄, 成功返回true
// 創建文件, 成功返回true, 失敗返回false
System.out.println(file6.createNewFile());

// 創建目錄, 成功返回true, 失敗返回false
System.out.println(new File("FileClass/test/NewDir1").mkdir());
System.out.println(new File("FileClass/test/NewDir2/NewDir3/NewDir4").mkdirs());

// 刪除文件 和 空目錄
System.out.println(file6.delete());
System.out.println(new File("FileClass/test/NewDir1").delete());

// 創建目錄
//StringBuilder sb = new StringBuilder("FileClass/test/");
//for (int i = 0; i < 200; i++) {
//    sb.append(i);
//    sb.append("/");
//}
//System.out.println(new File(sb.toString()).mkdirs());
//
//刪除目錄
//File fileForDel = new File(sb.toString());
//do {
//    try {
//        if (Integer.parseInt(fileForDel.getName()) < 0) {
//            System.out.println("刪除失敗");
//            return;
//        }
//    } catch (NumberFormatException e) {
//        return;
//    }
//    fileForDel.delete();
//    fileForDel = fileForDel.getParentFile();
//} while (true);

遍歷目錄

public String[] list()
// 返回目錄下所有文件 存放在字元串數組中

public File[] listFiles()
// 返回目錄下所有文件 存放在File數組中
String[] arr = new File("FileClass/test").list();
for (String s : arr) {
    System.out.println(s);
}

File[] fileArr = new File("FileClass/test").listFiles();
for (File file : fileArr) {
    System.out.println(file + "\t" + file.getName());
}

FileFilter介面

文件過濾器介面,此介面的實現類可以傳遞給方法listFiles(),實現文件的過濾功能
public boolean accept(File path):方法參數就是listFiles()方法獲取到的文件或者目錄的路徑。如果方法返回true,表示需要此路徑,否則此路徑將被忽略。

File dir = new File(".\\ConcurrentProgramming\\src\\_5_ThreadPool");
File[] files = dir.listFiles(new FileFilter() {
    @Override
    public boolean accept(File pathname) {
        //判斷如果獲取到的是目錄,直接放行
        if(pathname.isDirectory())
            return true;
        //獲取路徑中的文件名,判斷是否java結尾,是就返回true
        return pathname.getName().toLowerCase().endsWith("java");
    }
});
for(File file : files){
    System.out.println(file);
}

遞歸

指在當前方法內調用自己的這種現象。

public static void a(){
    a();
}

遞歸求和

計算1 ~ n的和

分析:num的累和 = num + (num-1)的累和,所以可以把累和的操作定義成一個方法,遞歸調用。

實現代碼:

public static void main(String[] args) {
    //計算1~num的和,使用遞歸完成
    int num = 5;
    // 調用求和的方法
    int sum = getSum(num);
    // 輸出結果
    System.out.println(sum);

}
public static int getSum(int num) {
    /*
    num為1時,方法返回1,
    相當於是方法的出口,num總有是1的情況
    */
    if(num == 1){
    	return 1;
    }
    /*
    num不為1時,方法返回 num +(num-1)的累和
    遞歸調用getSum方法
    */
    return num + getSum(num-1);
}

遞歸求階乘

階乘:所有小於及等於該數的正整數的積。

分析:n的階乘:n! = n * (n-1) ... 3 * 2 * 1

//計算n的階乘,使用遞歸完成
public static void main(String[] args) {
    int n = 3;
    // 調用求階乘的方法
    int value = getValue(n);
    // 輸出結果
    System.out.println("階乘為:"+ value);
}

public static int getValue(int n) {
    // 1的階乘為1
    if (n == 1) {
    	return 1;
}
    /*
    n不為1時,方法返回 n! = n*(n-1)!
    遞歸調用getValue方法
    */
    return n * getValue(n - 1);
}

目錄遍歷

遍歷目錄下的所有文件和所有的子目錄。

分析:目錄遍歷,無法判斷多少級目錄,所以在遍歷需要進行判斷,如果遍歷到的還是目錄,就要使用遞歸,遍歷所有目錄。

public static void main(String[] args){
    // 創建File對象
    show(new File("./").getAbsoluteFile());
}

public static void show(File dir) {
    // 獲取子文件和目錄
    File[] files = dir.listFiles();
    // 迴圈列印
    for (File file : files) {
        //判斷是文件,直接輸出
        if (file.isFile()) {
            System.out.println(file);
        } else {
            // 是目錄,繼續遍歷,形成遞歸
            show(file);
        }
    }
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 通過ESLint 檢測 JS/TS 代碼、Prettier 格式化代碼、Stylelint 檢測 CSS/SCSS 代碼和配置 EditorConfig 來實現前端代碼規範約束和統一。 ...
  • “我苦心鍛煉了三年,我變禿了,也變強了。” —— 琦玉老師 0x00 大綱 0x01 前言 四個月前,我在《你是來找茬的吧?對自己的博客進行調優》一文中探討了以博客的使用者而不是開發者身份去進行優化,究竟能做到何種程度的問題。當時以 Edge 瀏覽器的開發者工具里的 lighthouse 評分和載入 ...
  • 並不是所有的場景都適合微服務,我理解技術開發者都有一顆追求新技術的心,但是更重要的是業務場景及團隊。 關於微服務 微服務架構,說白了就是一種上層體系的演變。從最早的單體架構,到前後分離,SOA,甚至微服務架構,其實它們都在做一件事,並且都朝著一個方向去發展:那就是分而治之!從簡! 分而治之有什麼好處 ...
  • 該數據結構需要 Redis 5.0.0 + 版本才可用使用 概述 Redis stream 是 Redis 5 引入的一種新的數據結構,它是一個高性能、高可靠性的消息隊列,主要用於非同步消息處理和流式數據處理。在此之前,想要使用 Redis 實現消息隊列,通常可以使用例如:列表,有序集合、發佈與訂閱 ...
  • c/c++感受演算法快樂(3) 開始時間2023-04-16 22:21:10 結束時間2023-04-17 00:09:34 前言:很好,這周就要結束了,大家都回學校了麽,嘻嘻。回顧一下昨天的演算法題,1.4抓交通肇事犯運用枚舉模擬,1.5兔子產子問題運用迭代迴圈,1.6牛頓迭代法求方程根迭代迴圈,1 ...
  • 前言 在上一篇文章中,我們介紹了<<運算符的高級用法,本篇文章,我們將介紹>> 運算符的一些高級用法。 一、人物簡介 第一位閃亮登場,有請今後會一直教我們C語言的老師 —— 自在。 第二位上場的是和我們一起學習的小白程式猿 —— 逍遙。 二、優化除法運算 除法運算需要比位移運算需要更多的計算資源,某 ...
  • 網路分層結構 電腦網路體系大致分為三種,OSI七層模型、TCP/IP四層模型和五層模型。一般面試的時候考察比較多的是五層模型。最全面的Java面試網站 五層模型:應用層、傳輸層、網路層、數據鏈路層、物理層。 應用層:為應用程式提供交互服務。在互聯網中的應用層協議很多,如功能變數名稱系統DNS、HTTP協議 ...
  • 智能指針 智能指針(序) 相關的概念 指針:一個變數在記憶體中包含的是一個地址(指向其它數據) Rust 中最常見的指針就是”引用“ 引用: 使用 & 借用它指向的值 沒有其餘開銷 最常見的指針類型 智能指針 智能指針是這樣一些數據結構: 行為和指針相似 有額外的元數據和功能 引用計數(Referen ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...