1. 程式人生 > >Java:File類、遞迴、查詢檔案

Java:File類、遞迴、查詢檔案

1、File類-概述

1)java.io.File 這個類可以表示磁碟上的一個檔案/目錄,可以獲取檔案/目錄的一些屬性資訊:

檔案/目錄的名字

檔案的大小

檔案/目錄的最後修改時間

檔案/目錄是否可讀、是否可寫

2、File類-File類的構造方法

  • public File(String pathname) :通過將給定的路徑名字串轉換為抽象路徑名來建立新的 File例項。(路徑可以不存在)

  • public File(String parent, String child) :從父路徑名字串和子路徑名字串建立新的 File例項。

  • public File(File parent, String child)

    :從父抽象路徑名和子路徑名字串建立新的 File例項。

    //1.構造方法:File(String pathName)
    File file1 = new File("d:\\demo03.txt");//檔名--絕對路徑
    File file2 = new File("d:\\單級目錄");//目錄名--絕對路徑
    File file3 = new File("demo02.txt");//檔名--相對路徑
    File file4 = new File("d:\\jfewjfkeljfdsljfkljfksljfdkslajfdkslafjs");//不存在
    
    
    //2.構造方法:File(String parent,String child)
    File file5 = new File("d:\\", "demo03.txt");//效果同:file1 //3.構造方法:File(File parent,String child) File file6 = new File("d:\\"); File file7 = new File(file6, "demo03.txt");//效果同:file5和file1

3、File類-絕對路徑和相對路徑

1)、絕對路徑:是帶碟符的全路徑;

2)、絕對路徑:不帶碟符的,從專案根目錄下找;

4、File類-File類的常用方法-獲取的方法

  • public String getAbsolutePath()

    :返回此File的絕對路徑名字串。

  • public String getPath() :返回此File物件封裝的路徑名字串

  • public String getName() :返回由此File表示的檔案或目錄的名稱。

  • public long length() :返回由此File表示的檔案的長度(不能用於目錄)

    public static void main(String[] args) {
      File file1 = new File("d:\\demo03.txt");//絕對路徑--檔案存在
      File file2 = new File("demo03.txt");//相對路徑--檔案不存在
    
      System.out.println("file1的絕對路徑:" +file1.getAbsolutePath());
      System.out.println("file2的絕對路徑:" +file2.getAbsolutePath());
    
      System.out.println("file1封裝的路徑:" + file1.getPath());
      System.out.println("file2封裝的路徑:" + file2.getPath());
    
      System.out.println("file1的檔名:" + file1.getName());
      System.out.println("file2的檔名:" + file2.getName());
    
      System.out.println("file1的檔案大小:" + file1.length());
    
    }

5、File類-File類的常用方法-判斷的方法

  • public boolean exists() :此File表示的檔案或目錄是否實際存在。

  • public boolean isDirectory() :此File表示的是否為目錄。

  • public boolean isFile() :此File表示的是否為檔案。

    public static void main(String[] args) {
          File file1 = new File("d:\\demo03.txt");//絕對路徑--檔案存在
          File file2 = new File("demo03.txt");//相對路徑--檔案不存在
    
          System.out.println("file1是否存在:" + file1.exists());//true
          System.out.println("file2是否存在:" + file2.exists());//false
    
          System.out.println("file1是否是目錄:" + file1.isDirectory());//false
          System.out.println("file2是否是目錄:" + file2.isDirectory());//false
    
          System.out.println("file1是否是檔案:" + file1.isFile());//true
          System.out.println("file2是否是檔案:" + file2.isFile());//false
    
          File file3 = new File("d:\\單級目錄");
    
          System.out.println("file3是否存在:" + file3.exists());//true
          System.out.println("file3是否是檔案:" + file3.isFile());//false
          System.out.println("file3是否是目錄:" + file3.isDirectory());//true
    
      }
    }

6、File類-File類的常用方法-建立和刪除的方法

  • public boolean createNewFile() :當且僅當具有該名稱的檔案尚不存在時,建立一個新的空檔案。(建立成功返回true,建立失敗,返回false)

  • public boolean delete() :刪除由此File表示的檔案或目錄。(徹底刪除,只能刪除空目錄和檔案)

  • public boolean mkdir() :建立由此File表示的目錄。(建立單級目錄)

  • public boolean mkdirs() :建立由此File表示的目錄,包括任何必需但不存在的父目錄。(建立多級目錄)

    public static void main(String[] args) throws IOException {
      File file1 = new File("demo05.txt");
    
      System.out.println("建立檔案:" + file1.createNewFile());
    
      File file2 = new File("aaa");
      System.out.println("建立檔案:" + file2.createNewFile());
    
      File file3 = new File("bbb");
      System.out.println("建立目錄:" + file3.mkdir());
    
      File file4 = new File("demo05_2.txt");
      System.out.println("建立目錄:" + file4.mkdir());
    
      File file5 = new File("demo05\\demo04\\demo03");
      System.out.println("建立多級目錄:" + file5.mkdirs());
    
    
      System.out.println("刪掉demo05.txt : " + file1.delete());
      System.out.println("刪除空目錄:" + file3.delete());//不能刪除非空目錄
    
    }

7、File類-練習-遍歷單級目錄

public File[] listFies():獲取此目錄下的所有檔案/目錄下的檔案物件,並存為陣列

public static void main(String[] args) {
    File file = new File("d:\\");

    File[] fileArray = file.listFiles();

    for (File f : fileArray) {
        System.out.println((f.isFile()? "檔案:" : "目錄:") + f.getAbsolutePath());
    }
}

注意:listFiles在以下情況下返回null:

1)、當前的File物件表示的是一個檔案;

2)、當前的File物件表示的是一個系統目錄;

3)、當前的File物件表示的目錄不存在

如果File物件是一個存在的空目錄,listFile會返回一個0長度的陣列

8、遞迴-前奏-方法呼叫解析

public class Demo {
    public static void main(String[] args) {
        f1();
        System.out.println("a");
    }

    private static void f1() {
        f2();
        System.out.println("b");
    }

    private static void f2() {
        f3();
        System.out.println("c");
    }

    private static void f3() {
        System.out.println("d");
    }
}

執行結果為dcba 這裡寫圖片描述

9、遞迴-遞迴的概念-示例-圖示

遞迴:方法的遞迴呼叫,指方法呼叫自己本身

public class Demo {
    private static int count = 0;
    public static void main(String[] args) {
        f1();
    }

    private static void f1() {
        count++;
        System.out.println("f1... count = " + count);
        f1();
    }
}

這裡寫圖片描述

注意:

1)遞迴的層次不能太深,否則“棧溢位”

2)、必須要有出口,否則就是“死遞迴”

3)、構造方法不能使用遞迴呼叫

public class Demo {
    private static int count = 0;
    public static void main(String[] args) {
        f1();
    }

    private static void f1() {
        count++;
        System.out.println("f1... count = " + count);
        if (count == 3) {
            return;//設定出口
        }
        f1();
    }
}

這裡寫圖片描述

10、遞迴-練習-遞迴求階乘

求階乘:如5!=5 * 4 * 3 * 2 * 1

使用迴圈:

int result = 1;
for(int i = 1 ;i <= 5; i++){
    result = result * i;
}
System.out.println("結果是:" + result);

使用遞迴:

public static void main(String[] args){
    int num = 5;
    System.out.println(num + " 的階乘為:" + jieCheng5(num));
    }
public static int jieCheng5(int num){
    if(num == 1){
        return 1;//出口
    }
    return num * jieCheng5(num - 1);
}

這裡寫圖片描述

11、遞迴-練習-遞迴遍歷多級目錄

public class Demo {
    public static void main(String[] args) {
        //需求:將d:\\aaa2目錄下所有的檔案查找出來,並列印其絕對路徑
        /*
            1).封裝初始目錄:
            ---------------遞迴方法--------------
            2).獲取此目錄下所有的子檔案/子目錄的File[]陣列
            3).遍歷陣列,判斷是否是檔案:
                    是:列印
                    否:從步驟2 到這裡形成遞迴
         */
        //1).封裝初始目錄:
        File dir = new File("d:\\aaa2");
        listFiles(dir);
    }

    private static void listFiles(File dir)         
         //2).獲取此目錄下所有的子檔案/子目錄的File[]陣列
        File[] fileArray = dir.listFiles();
        //3).遍歷陣列,判斷是否是檔案:
        if (fileArray != null) {
            for (File f : fileArray) {
                if (f.isFile()) {
                    System.out.println(f.getAbsolutePath());
                }else{
                    listFiles(f);
                }
            }
        }
    }
}

12、案例-檔案搜尋-第一版-自過濾

public class Demo {
    public static void main(String[] args) {
        //1.封裝初始目錄
        Scanner sc = new Scanner(System.in);
        System.out.println("請輸入查詢路徑:");
        String path = sc.nextLine();
        System.out.println("請輸入要搜尋的字尾名(例如:avi):");
        String suffix = sc.next();

        File dir = new File(path);
        listFiles(dir,suffix);
    }

    private static void listFiles(File dir,String suffix) {
        //2.列出此目錄下所有的子檔案/子目錄的陣列
        File[] fileArray = dir.listFiles();
        //3.遍歷
        if (fileArray != null) {
            for (File f : fileArray) {
                if (f.isFile() && f.getName().endsWith("." + suffix)) {
                    System.out.println(f.getAbsolutePath());
                }else{
                    listFiles(f,suffix);
                }
            }
        }
    }
}

13、案例-檔案搜尋-檔案過濾器說明

public static void main(String[] args) {
    File f = new File("d:\\aaa2");
    File[] fileArray = f.listFiles(new FileFilter() {//過濾器
        @Override
        public boolean accept(File pathname) {//篩網--listFiles方法會將f的每個子檔案/子目錄都走一下這個篩網
            if (pathname.isFile() && pathname.getName().endsWith(".txt")) {
                return true;//保留--會儲存到陣列中
            }
            return false;//丟棄
        }
    });
    System.out.println("陣列大小:" + fileArray.length);
}

14、案例-檔案搜尋-過濾器

public class Demo {
    public static void main(String[] args) {
        //搜尋:"D:\20180903(76期)_就業班(上午)"目錄下所有的.avi檔案

        File dir = new File("D:\\20180903(76期)_就業班(上午)");

        listFiles(dir);
    }

    private static void listFiles(File dir) {
        File[] fileArray = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                if((pathname.isFile() && pathname.getName().endsWith(".avi")) || pathname.isDirectory()){
                return true;
            }
                return false;
        }
        });
        //遍歷
        if (fileArray != null) {
            for (File f : fileArray) {
                if (f.isFile()) {
                    System.out.println(f.getAbsolutePath());
                }else{
                    listFiles(f);//遞迴呼叫
                }
            }
        }
    }
}

15、案例-檔案搜尋-Lambda表示式

public class Demo {
    public static void main(String[] args) {
        //搜尋:"D:\20180903(76期)_就業班(上午)"目錄下所有的.avi檔案

        File dir = new File("D:\\20180903(76期)_就業班(上午)");

        listFiles(dir);
    }

    private static void listFiles(File dir) {
        File[] fileArray = dir.listFiles((File pathname) -> {
                if((pathname.isFile() &&                    
                    pathname.getName().endsWith(".avi")) 
                    || pathname.isDirectory()){
                    return true;
                }
                return false;
            }
        );
        //遍歷
        if (fileArray != null) {
            for (File f : fileArray) {
                if (f.isFile()) {
                    System.out.println(f.getAbsolutePath());
                }else{
                    listFiles(f);//遞迴呼叫
                }
            }
        }
    }
}

複習

  • [ ] 能夠說出File物件的建立方式

    File file = new File("路徑");
    File file = new File("父路徑","子路徑");
    File parent = new File("父路徑");
    File file = new File(parent,"子路徑");
  • [ ] 能夠說出File類獲取名稱的方法名稱

    getName();
  • [ ] 能夠說出File類獲取絕對路徑的方法名稱

    getAbsolutePath();//獲取絕對路徑
    getPath();//獲取封裝的檔案路徑
  • [ ] 能夠說出File類獲取檔案大小的方法名稱

    length();
  • [ ] 能夠說出File類判斷是否是檔案的方法名稱

    isFile();
  • [ ] 能夠說出File類判斷是否是資料夾的方法名稱

    isDirectory();
  • [ ] 能夠辨別相對路徑和絕對路徑

    絕對路徑:從碟符開始的路徑

    相對路徑:從當前資料夾開始

  • [ ] 能夠遍歷資料夾

    File file = new File("路徑");
    File[] fileArray = file.listFile();
    for(File f:fileArray){
      System.out.println(f.getAbsolutePath(););
    }
  • [ ] 能夠解釋遞迴的含義

    方法自己呼叫自己

  • [ ] 能夠使用遞迴的方式計算5的階乘

    Scanner scanner = new Scanner(System.in);
    int num = scanner.nextInt();
    System.out.println(num+"的階乘為:"+jianCheng(num));
    
    public int jianCheng(int num){
      if(num == 1){
          return 1;
      }else{
          return num * janCheng(num - 1);
      }
    }
  • [ ] 能夠說出使用遞迴會記憶體溢位隱患的原因

    沒有出口的遞迴,一直壓棧,沒有彈棧