1. 程式人生 > >Java之File與遞歸

Java之File與遞歸

必須 文件的 nta 傳智 public 抽象 static accep 繼續

File類的使用和遞歸思想

File類

概述

文件: 存儲數據

文件夾: 管理文件與文件夾

構造方法

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

常用方法

創建方法

  • public boolean createNewFile() : 創建文件,存在返回false,不存在創建文件返回true
  • boolean mkdir() : 創建文件夾,存在返回false,不存在創建文件夾返回true
  • boolean mkdirs() : 創建多級文件夾,存在返回false,不存在創建多級文件夾返回true

刪除方法

  • boolean delete() : 刪除文件或者文件夾,文件存在返回true,文件不存在返回false;
    可以刪除空的文件夾,如果文件夾下有子文件或者子文件夾,刪除不掉

判斷方法

  • public boolean exists() :此File表示的文件或目錄是否實際存在。
  • public boolean isDirectory() :此File表示的是否為目錄(文件夾)。
  • public boolean isFile() :此File表示的是否為文件。

路徑問題

絕對路徑 : 以盤符開頭
相對路徑 : 相對於本項目

  • public String getAbsolutePath() :返回此File的絕對路徑名字符串。
  • public String getParent() : 獲取父路徑,在創建對象時制定了父路徑才能獲取,沒有指定返回null(相對路徑返回null).
  • public String getPath() :將此File轉換為路徑名字符串(獲取構建時的路徑)。
  • public String getName() :返回由此File表示的文件或目錄的名稱。
  • public long length() :返回由此File表示的文件的長度。

高級方法

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

遞歸

概述

遞歸就是方法內部自己調用自己.

註意事項

  • 必須有出口,否則會出現棧內存溢出的錯誤.
  • 遞歸的次數不宜過多.否則容易出現棧內存溢出
  • 構造方法不能遞歸

理解

對於遞歸,可以使用棧來理解,入棧和出棧,對於整個程序的流程,首先,main方法入棧,接著遞歸方法入棧,方法內調用自己,
繼續入棧,知道出口進行返回出棧,層層出棧,這個就是底層的原理吧.

計算n的階乘

import java.util.Scanner;

/**
 * 求n階乘
 *  1.手動輸入計算的值
 *  2.創建遞歸方法進行計算
 * @author WZLOVE
 * @create 2018-07-20 14:34
 */
public class Demo1 {

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);

        System.out.println("請輸入您要計算的值是:");
        int n = in.nextInt();
        in.close();

        long result = getRecursive(n);

        System.out.println("您輸入的值的階乘計算結果為:" + result);

    }

    public static long getRecursive(int n){

        // 定義出口
        if( n == 1 ){
            return 1;
        }

        return n * getRecursive( n - 1 );
    }
}

打印多級目錄

package com.wzlove.recursive;

import java.io.File;

/**
 * 遍歷多級目錄
 *
 * @author WZLOVE
 * @create 2018-07-20 15:11
 */
public class Demo2 {

    public static void main(String[] args) {

        // 程序的健壯性測試
        // File file = null;
       // File file = new File("E:\\");
       // 測試路徑
        File file = new File("G:\\工作區間\\Intellij IDEA\\JavaSE");
        printDirsAndFiles(file);
    }

    public static void printDirsAndFiles(File file){

        // 程序的健壯性
        if(file == null || !file.exists()){
            return ;
        }

        // 如果是文件,直接輸出
        if(file.isFile()){
            System.out.println(file.getAbsolutePath());
        }


        // 如果是文件夾,進行遍歷遞
        File[] files = file.listFiles();
        // 如果沒有訪問權限,直接返回
        if(files == null){
            return ;
        }
        for (File file1 : files) {

            if(file1.isFile()){

                System.out.println(file1.getAbsolutePath());

            } else {

                System.out.println(file1.getAbsolutePath());

                printDirsAndFiles(file1);

            }

        }
    }
}

打印某個目錄下的所有.java文件

兩種方法,第一種:

package com.wzlove.recursive;

import java.io.File;

/**
 * 搜索G:\工作區間\Intellij IDEA\JavaSE 目錄中的.java 文件。
 *  1.創建File的對象,傳遞File的虛擬路徑
 *  2.遞歸方法
 *  3.進行健壯性判斷:
 *      * null的判斷
 *      * 文件不存在
 *      * 如果路徑是文件,這三種情況都是直接返回
 *      * 如果路徑合法
 *          (1) 判斷有無權限,有繼續向下,無直接返回
 *          (2) 返回該文件夾下的所有文件和文件夾
 *          (3) 增強for循環進行遍歷
 *              如果是文件,判斷是否滿足要求(遞歸的出口)
 *              如果是文件夾,進行遞歸調用
 *
 * @author WZLOVE
 * @create 2018-07-20 16:27
 */
public class Demo3 {

    public static void main(String[] args) {
        File file = new File("G:\\工作區間\\Intellij IDEA\\JavaSE");
        printAllJavaFiles(file);
    }

    public static void printAllJavaFiles(File file){
        if(file == null || !file.exists() || file.isFile()){
            return ;
        }

        File[] files = file.listFiles();
        if(files == null){
            return ;
        }
        for (File file1 : files) {
            if(file1.isFile()){
                if(file1.getName().endsWith(".java")){
                    System.out.println(file1.getAbsolutePath());
                }
            }else{
                printAllJavaFiles(file1);
            }
        }
    }

}

第二種,要使用到文件過濾器:

  • File[] listFiles(FileFilter filter) 返回一個抽象路徑名數組,表示由此抽象路徑名表示的滿足指定過濾器的目錄中的文件和目錄。

      package com.wzlove.recursive;
    
      import java.io.File;
      import java.io.FileFilter;
    
      /**
       *
       * @author WZLOVE
       * @create 2018-07-20 16:27
       */
      public class Demo4 {
    
          public static void main(String[] args) {
              File file = new File("G:\\工作區間\\Intellij IDEA\\傳智播客\\JavaSE");
              printAllJavaFiles(file);
          }
    
          public static void printAllJavaFiles(File file){
              if(file == null || !file.exists() || file.isFile()){
                  return ;
              }
    
              // 使用listFiles(FileFilter)
              /**
               * File[] listFiles(FileFilter filter)
               * 返回一個抽象路徑名數組,表示由此抽象路徑名表示的滿足指定過濾器的目錄中的文件和目錄。
               */
              File[] files = file.listFiles(new FileFilter() {
                  @Override
                  public boolean accept(File pathname) {
                      if(pathname.isFile() && pathname.getName().endsWith(".java")){
                          // 是以.java文件結尾的文件
                          return true;
                      }
                      // 如果是文件夾,也進行返回
                      if(pathname.isDirectory()){
                          return true;
                      }
                      // 其余情況返回false
                      return false;
                  }
              });
    
              for (File file1 : files) {
                  if(file1.isFile()){
                      System.out.println(file1.getAbsolutePath());
                  }else{
                      printAllJavaFiles(file1);
                  }
              }
    
          }
    
      }

Java之File與遞歸