1. 程式人生 > >IO【File、遞迴】

IO【File、遞迴】

微信公眾號:菜鳥永恆 歡迎關注

第10天 File,遞迴
今日內容介紹
 File
 遞迴
今日學習目標
 能夠說出File物件的建立方式
 能夠說出File類獲取名稱的方法名稱
 能夠說出File類獲取絕對路徑的方法名稱
 能夠說出File類獲取檔案大小的方法名稱
 能夠說出File類判斷是否是檔案的方法名稱
 能夠說出File類判斷是否是資料夾的方法名稱
 能夠辨別相對路徑和絕對路徑
 能夠遍歷資料夾
 能夠解釋遞迴的含義
 能夠使用遞迴的方式計算5的階乘
 能夠說出使用遞迴會記憶體溢位隱患的原因

第1章 File
在我們作業系統中,資料都儲存在檔案中,而檔案存放相應的資料夾中。那麼Java中是如何描述這些的呢?
1.1 File類的出現
開啟API,搜尋File類。閱讀其描述:File檔案和目錄路徑名的抽象表示形式。即,Java中把檔案或者目錄(資料夾)都封裝成File物件。也就是說如果我們要去操作硬碟上的檔案,或者資料夾只要找到File這個類即可。那麼我們就要研究研究File這個類中都有那些功能可以操作檔案或者資料夾呢?
1.2 File類的構造方法


 通過構造方法建立File物件,我們進行演示:

public class FileDemo {
    public static void main(String[] args) {
        //File建構函式演示
        String pathName = "e:\\java_code\\day22e\\hello.java";
        File f1 = new File(pathName);//將Test22檔案封裝成File物件。注意;有可以封裝不存在檔案或者資料夾,變成物件。
        System.out.println(f1);

        File f2 = new File("e:\\java_code\\day22e","hello.java");
        System.out.println(f2);

        //將parent封裝成file物件。
        File dir = new File("e:\\java_code\\day22e");
        File f3 = new File(dir,"hello.java");
        System.out.println(f3);
    }
}

1.3 File類的獲取方法
建立完了File物件之後,那麼File類中都有如下常用方法,可以獲取檔案相關資訊


 方法演示如下:

public class FileMethodDemo {
    public static void main(String[] args) {
        //建立檔案物件
        File file = new File("Test22.java");
        //獲取檔案的絕對路徑,即全路徑
        String absPath = file.getAbsolutePath();
        //File中封裝的路徑是什麼獲取到的就是什麼。
        String path = file.getPath();
        //獲取檔名稱
        String filename = file.getName();
        //獲取檔案大小
        long size = file.length();

        System.out.pri ntln("absPath="+absPath);
        System.out.println("path="+path);
        System.out.println("filename="+filename);
        System.out.println("size="+size);
    }
}

1.4 檔案和資料夾的建立刪除等
經常上面介紹,我們知道可以通過File獲取到檔名稱,檔案路徑(目錄)等資訊。
接下來演示使用File類建立、刪除檔案等操作。


 我們進行方法的演示

public class FileMethodDemo2 {
    public static void main(String[] args) throws IOException {
        // 對檔案或者檔案加進行操作。
        File file = new File("e:\\file.txt");
        // 建立檔案,如果檔案不存在,建立 true 如果檔案存在,則不建立 false。 如果路徑錯誤,IOException。
        boolean b1 = file.createNewFile();
        System.out.println("b1=" + b1);
        //-----------刪除檔案操作-------注意:不去回收站。慎用------
         boolean b2 = file.delete();
         System.out.println("b2="+b2);

        //-----------需要判斷檔案是否存在------------
         boolean b3 = file.exists();
         System.out.println("b3="+b3);

        //---------- ----------
        File dir = new File("e:\\abc");
        //mkdir()建立單個目錄。//dir.mkdirs();建立多級目錄
        boolean b4 = dir.mkdir();
        System.out.println("b4="+b4);
        //刪除目錄時,如果目錄中有內容,無法直接刪除。
        boolean b5 = dir.delete();
        //只有將目錄中的內容都刪除後,保證該目錄為空。這時這個目錄才可以刪除。
        System.out.println("b5=" + b5);

        //-----------判斷檔案,目錄------------
        File f = new File("e:\\javahaha");// 要判斷是否是檔案還是目錄,必須先判斷存在。
        // f.mkdir();//f.createNewFile();
        System.out.println(f.isFile());
        System.out.println(f.isDirectory());
    }
}

1.5 listFiles()和list()方法介紹
檔案都存放在目錄(資料夾)中,那麼如何獲取一個目錄中的所有檔案或者目錄中的資料夾呢?那麼我們先想想,一個目錄中可能有多個檔案或者資料夾,那麼如果File中有功能獲取到一個目錄中的所有檔案和資料夾,那麼功能得到的結果要麼是陣列,要麼是集合。我們開始查閱API。


 方法演示如下:

public class FileMethodDemo3 {
    public static void main(String[] args) {
        File dir = new File("e:\\java_code");
        //獲取的是目錄下的當前的檔案以及資料夾的名稱。
        String[] names = dir.list();
        for(String name : names){
            System.out.println(name);
        }
        //獲取目錄下當前檔案以及檔案物件,只要拿到了檔案物件,那麼就可以獲取其中想要的資訊
        File[] files = dir.listFiles();
        for(File file : files){
            System.out.println(file);
        }
    }
}

注意:在獲取指定目錄下的檔案或者資料夾時必須滿足下面兩個條件
1,指定的目錄必須是存在的,
2,指定的必須是目錄。
否則容易返回陣列為null,再使用該null陣列時會出現NullPointerException

第2章 遞迴
2.1 遞迴的概述
遞迴,指在當前方法內呼叫自己的這種現象
public void method(){
System.out.println(“遞迴的演示”);
//在當前方法內呼叫自己
method();
}
遞迴分為兩種,直接遞迴和間接遞迴。
直接遞迴稱為方法自身呼叫自己。間接遞迴可以A方法呼叫B方法,B方法呼叫C方法,C方法呼叫A方法。
注意:1.遞迴一定要有條件限定,保證遞迴能夠停止下來,否則會發生棧記憶體溢位。
2.在遞迴中雖然有限定條件,但是遞迴次數不能太多。否則也會發生棧記憶體溢位。
構造方法禁止遞迴

 遞迴的程式碼演示,計算1-n之間的和,使用遞迴完成

public class DiGuiDemo {
    public static void main(String[] args) {
        //計算1~num的和,使用遞迴完成
        int n = 5;
        int sum = getSum(n);
        System.out.println(sum);

    }
    public static int getSum(int n) {
        if(n == 1){
            return 1;
        }
        return n + getSum(n-1);
    }
}

 程式碼執行流程圖解


2.2 遞迴列印所有子目錄中的檔案路徑
編寫一個方法用來列印指定目錄中的檔案路徑,並進行方法的呼叫
要求:若指定的目錄有子目錄,那麼把子目錄中的檔案路徑也打印出來
步驟:
1. 指定要列印的目錄File物件
2. 呼叫getFileAll()方法
2.1 獲取指定目錄中的所有File物件
2.2 遍歷得到每一個File物件
2.3 判斷當前File 物件是否是目錄
判斷結果為true,說明為目錄,通過遞迴,再次呼叫步驟2的getFileAll()方法
判斷結果為false,說明是檔案,列印檔案的路徑
 程式碼演示

public class FileDemo2 {
    public static void main(String[] args) {
        File file = new File("d:\\test");
        getFileAll(file);
    }
    //獲取指定目錄以及子目錄中的所有的檔案
    public static void getFileAll(File file) {
        File[] files = file.listFiles();
        //遍歷當前目錄下的所有檔案和資料夾
        for (File f : files) {
            //判斷當前遍歷到的是否為目錄
            if(f.isDirectory()){
                //是目錄,繼續獲取這個目錄下的所有檔案和資料夾
                getFileAll(f);
            }else{
                //不是目錄,說明當前f就是檔案,那麼就打印出來
                System.out.println(f);
            }
        }
    }
}