第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); } } } }