IO【File、遞歸】

第10天 File,遞歸
今日內容介紹
 File
 遞歸
今日學習目標
 可以說出File對象的建立方式
 可以說出File類獲取名稱的方法名稱
 可以說出File類獲取絕對路徑的方法名稱
 可以說出File類獲取文件大小的方法名稱
 可以說出File類判斷是不是文件的方法名稱
 可以說出File類判斷是不是文件夾的方法名稱
 可以辨別相對路徑和絕對路徑
 可以遍歷文件夾
 可以解釋遞歸的含義
 可以使用遞歸的方式計算5的階乘
 可以說出使用遞歸會內存溢出隱患的緣由java

第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類中都有以下經常使用方法,能夠獲取文件相關信息學習


 方法演示以下:ui

 

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類建立、刪除文件等操做。spa


 咱們進行方法的演示操作系統

 

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。code


 方法演示以下:對象

 

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);
            }
        }
    }
}
相關文章
相關標籤/搜索