JavaSE-File類、遞歸

目錄

[TOC]

第一章:File類

1.1 File類介紹

? java.io.File 類是文件和目錄路徑名的抽象表示,主要用于文件和目錄的創建、查找和刪除等操作。

1.2 構造方法

  • 語法

    1. public File(String pathname) :通過將給定的路徑名字符串轉換為抽象路徑名來創建新的 File實例。
    2. public File(String parent, String child) :從父路徑名字符串和子路徑名字符串創建新的 File實例。
    3. public File(File parent, String child) :從父抽象路徑名和子路徑名字符串創建新的 File實例。
  • 代碼

        // 創建File對象-方式1
        File file1 = new File("D:\\JavaCode\\BasicCode\\a");
        System.out.println(file1);
        // 創建File對象-方式2
        File file2 = new File("D:\\JavaCode\\BasicCode\\a","1.txt");
        System.out.println(file2);
        // 創建File對象-方式3
        File file3 = new File(file1,"1.txt");
        System.out.println(file3);
    
  • 注意事項

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

1.3 File類靜態成員

  • 靜態成員

    1. public static final String pathSeparator
      • 與系統有關的路徑分隔符。
    2. public static final String separator
      • 獲取與系統有關的默認名稱分隔符。
  • 代碼

        System.out.println(File.pathSeparator);  // ";"
        System.out.println(File.separator); // "/"
      // 注意:不同的操作系統獲取的分隔符是不一樣的
    

1.4 常用方法

  1. 獲取功能-相關方法

    • 方法

      1. public String getAbsolutePath():返回此File的絕對路徑名字符串。
      2. public String getPath() :將此File轉換為路徑名字符串。
      3. public String getName():返回由此File表示的文件或目錄的名稱。
      4. public long length():返回由此File表示的文件的長度。
    • 代碼

        public static void main(String[] args) {
          // 1. `public String getAbsolutePath() `:返回此File的絕對路徑名字符串。
          show1();
          // 2. `public String getPath()` :將此File轉換為路徑名字符串。
          show2();
          // 3. `public String getName() `:返回由此File表示的文件或目錄的名稱。
          show3();
          // 4. `public long length() `:返回由此File表示的文件的長度(文件的大小)
          show4();
        }
      
        private static void show4() {
          // 不存在的文件夾或不存在的文件或存在的文件夾返回的都是0
          File file1 = new File("D:\\JavaCode\\BasicCode\\a");
          System.out.println(file1.length()); // 0
          File file3 = new File("D:\\JavaCode\\BasicCode\\aa");
          System.out.println(file3.length()); //0
          File file2 = new File("D:\\JavaCode\\BasicCode\\a\\logo01.png");
          System.out.println(file2.length()); //11610 字節
        }
      
        private static void show3() {
          File file1 = new File("D:\\JavaCode\\BasicCode\\a");
          System.out.println(file1.getName()); // a
          File file2 = new File("1.txt");   // 1.txt
          System.out.println(file2.getName());
        }
      
        private static void show2() {
          // 文件路徑是什么就返回什么
          File file1 = new File("D:\\JavaCode\\BasicCode\\1.txt");
          System.out.println(file1.getPath()); // D:\JavaCode\BasicCode\1.txt
          File file2 = new File("1.txt");   // 1.txt
          System.out.println(file2.getPath());
        }
      
        private static void show1() {
          File file1 = new File("D:\\JavaCode\\BasicCode\\1.txt");
          System.out.println(file1.getAbsoluteFile()); // D:\JavaCode\BasicCode\1.txt
          File file2 = new File("1.txt");   // D:\JavaCode\BasicCode\1.txt
          System.out.println(file2.getAbsoluteFile());
        }
      
  2. 絕對路徑和相對路徑

    • 絕對路徑:從盤符開始的路徑,這是一個完整的路徑。
    • 相對路徑:相對于項目目錄的路徑,這是一個便捷的路徑,開發中經常使用。
  3. 判斷功能-相關方法

    • 方法

      1. public boolean exists() :此File表示的文件或目錄是否實際存在。
      2. public boolean isDirectory() :此File表示的是否為目錄(目錄實際存在)。
      3. public boolean isFile() :此File表示的是否為文件(文件實際存在)。
    • 代碼

          File file1 = new File("a");
          // 1. `public boolean exists()` :此File表示的文件或目錄是否實際存在。
          System.out.println(file1.exists());  // true
          // 2. `public boolean isDirectory()` :此File表示的是否為目錄。
          System.out.println(file1.isDirectory()); // true
          // 3. `public boolean isFile()` :此File表示的是否為文件。
          System.out.println(file1.isFile());  // false
      
  4. 創建刪除功能-相關方法

    • 方法

      1. public boolean createNewFile() :當且僅當具有該名稱的文件尚不存在時,創建一個新的空文件。
      2. public boolean delete():刪除由此File表示的文件或目錄。
      3. public boolean mkdir() :創建由此File表示的目錄。
      4. public boolean mkdirs():創建由此File表示的目錄,包括任何必需但不存在的父目錄。
    • 代碼

        public static void main(String[] args) throws IOException {
          // 1. `public boolean createNewFile()` :當且僅當具有該名稱的文件尚不存在時,創建一個新的空文件。
          File file1 = new File("a"); // 已經存在的文件目錄
          System.out.println(file1.createNewFile()); // false
          File file2 = new File("b"); // 不存在的文件
          System.out.println(file2.createNewFile()); // true
          // 2. `public boolean delete() `:刪除由此File表示的文件或目錄。
          File file3 = new File("c"); // 不存在的文件
          System.out.println(file3.delete()); // false
          File file4 = new File("b"); // 不存在的文件
          System.out.println(file4.delete()); // true
          // 3. `public boolean mkdir()` :創建由此File表示的目錄。
          File file5 = new File("e"); // 不存在的文件目錄
          System.out.println(file5.mkdir()); // true
          File file6 = new File("e//g/f"); // 多級文件目錄
          System.out.println(file6.mkdir()); // false
          // 4. `public boolean mkdirs() `:創建由此File表示的目錄,包括任何必需但不存在的父目錄。
          System.out.println(file6.mkdirs()); // true
      
        }
      

1.5 目錄的遍歷

  • 方法

    1. public String[] list() :返回一個String數組,表示該File目錄中的所有子文件或目錄。
    2. public File[] listFiles() :返回一個File數組,表示該File目錄中的所有的子文件或目錄。
  • 代碼

        // 1. `public String[] list()` :返回一個String數組,表示該File目錄中的所有子文件或目錄。
        File file1 = new File("D:\\JavaCode\\BasicCode");
        String[]files = file1.list();
        for (int i = 0; i < files.length; i++) {
          System.out.println(files[i]);
        }
        //2. `public File[] listFiles()` :返回一個File數組,表示該File目錄中的所有的子文件或目錄。
        File file2 = new File("D:\\JavaCode\\BasicCode");
        File[]files2 = file2.listFiles();
        for (int i = 0; i < files2.length; i++) {
          System.out.println(files2[i]);
        }
    
  • 注意事項

    • 調用listFiles方法的File對象,表示的必須是實際存在的目錄,否則返回null,無法進行遍歷。

第二章:遞歸

2.1 遞歸介紹

  • 遞歸,函數自身調用自身的編程技巧。
  • 遞歸的分類:
    • 直接遞歸稱為方法自身調用自己。
    • 間接遞歸可以A方法調用B方法,B方法調用C方法,C方法調用A方法。
  • 遞歸注意事項:
    1. 遞歸一定要有條件限定,保證遞歸能夠停止下來,否則會發生棧內存溢出。
    2. 在遞歸中雖然有限定條件,但是遞歸次數不能太多。否則也會發生棧內存溢出。
    3. 構造方法,禁止遞歸

2.2 遞歸練習1

  • 需求:計算數字1 ~ n的和

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

  • 代碼:

      // 計算數字1 ~ n的和
      public static void main(String[] args) {
        int sum = getSum(3);
        System.out.println(sum);
      }
    
      private static int getSum(int n) {
        // 判斷遞歸結束條件
        if(n==1) {
          return 1;
        }
        // 遞歸任務
        return n + getSum(n-1);
      }
    
    
  • 圖解:

2.3 遞歸練習2

  • 需求:階乘所有小于及等于該數的正整數的積。

    • n的階乘:n! = n * (n‐1) *...* 3 * 2 * 1 x
  • 分析:這與累和類似,只不過換成了乘法運算

    • 推理得出:n! = n * (n‐1)!
  • 代碼

      public static void main(String[] args) {
        int result = factorial(3);
        System.out.println(result);
      }
    
      private static int factorial(int n) {
        if(n==1) {
          return 1;
        }
        return n * factorial(n-1);
      }
    

2.4 遞歸練習3

  • 需求:打印多級目錄及文件

  • 代碼:

      public static void main(String[] args) {
        File file = new File("D:\\JavaCode\\BasicCode\\dir");
        readFile(file);
      }
      // 定義讀取目錄文件的方法
      private static void readFile(File file) {
       // 獲取子文件和子目錄
        File[]files = file.listFiles();
        // 循環遍歷子文件和子目錄
        for (File f : files) {
          if(f.isDirectory()){
            readFile(f);
          }else {
            System.out.println(f);
          }
        }
      }
    

2.5 遞歸練習4

  • 需求: 給一個指定的目錄,遞歸實現過濾出該目錄中所有的以及嵌套目中.java文件

  • 代碼:

      public static void main(String[] args) {
        File file = new File("D:\\JavaCode\\BasicCode");
        readFile(file);
      }
      // 定義讀取目錄文件的方法
      private static void readFile(File file) {
        // 獲取子文件和子目錄
        File[]files = file.listFiles();
        // 循環遍歷子文件和子目錄
        for (File f : files) {
          if(f.isDirectory()){
            readFile(f);
          }else {
            if(f.getName().toLowerCase().endsWith(".java")){
              System.out.println(f);
            }
          }
        }
      }
    

2.6 文件過濾器

? java.io.FileFilter 是一個接口,是File的過濾器。 該接口的對象可以傳遞給File類的 listFiles(FileFilter)方法作為參數, 接口中只有一個方法。

? boolean accept(File pathname) :測試pathname是否應該包含在當前File目錄中,符合則返回true。 ?

  • 需求:和上述練習4一樣

  • 分析

    1. 接口作為參數,需要傳遞子類對象,重寫其中方法。我們選擇匿名內部類方式,比較簡單。

    2. accept 方法,參數為File,表示當前File下所有的子文件和子目錄。保留住則返回true,過濾掉則返回 false。保留規則:

      1. 要么是.java文件。
      2. 要么是目錄,用于繼續遍歷。
    3. 通過過濾器的作用, listFiles(FileFilter) 返回的數組元素中,子文件對象都是符合條件的,可以直接打

      印。

  • 代碼1:匿名內部類

      public static void main(String[] args) {
        File file = new File("D:\\JavaCode\\BasicCode");
        readFile(file);
      }
      // 定義讀取目錄文件的方法
      private static void readFile(File file) {
        // 獲取子文件和子目錄
        File[]files = file.listFiles(new FileFilter() {
          @Override
          public boolean accept(File pathname) {
            // 符合條件的File
            return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java");
          }
        });
        // 循環遍歷子文件和子目錄
        for (File f : files) {
          if(f.isFile()){
            System.out.println(f);
          }else {
            readFile(f);
          }
        }
      }
    
  • 代碼2:Lambda表達式

      public static void main(String[] args) {
        File file = new File("D:\\JavaCode\\BasicCode");
        readFile(file);
      }
      // 定義讀取目錄文件的方法
      private static void readFile(File file) {
        // 獲取子文件和子目錄
        File[]files = file.listFiles(pathname -> pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java"));
        // 循環遍歷子文件和子目錄
        for (File f : files) {
          if(f.isFile()){
            System.out.println(f);
          }else {
            readFile(f);
          }
        }
      }
    
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容