IO(File 遞迴),iofile遞迴
File概述
java.io.File類:檔案和目錄路徑名的抽象表示形式。
用來描述電腦中檔案,檔案夾,以及路徑類
常用的3個和File有關的單詞:
file:檔案
directory:檔案夾(目錄)
path:路徑
File是一個與系統無關的類
File類的3個重載的構造方法
路徑:
window系統的目錄分隔字元是一個\
java中的目錄分隔字元是:\\或者/
路徑的分類:
絕對路徑:以盤符開始的路徑
例如:D:\\ase\\20170514\\day10
D:\\Work_EE_266\\day10\\src
相對路徑:相對於當前項目來說,路徑編寫的時候可以省略盤符到項目之間的路徑
D:\\Work_EE_266\\day10-->src
注意:路勁不區分大小寫
File(File parent, String child)
傳遞路徑,傳遞 File 類型父路徑,字串類型子路徑
好處:父路徑是 File 類型,父路徑可以直接調用 File 類的方法
File(String parent, String child)
傳遞路徑,傳遞字串類型父路徑,字串類型的子路徑
好處:單獨操作父路徑和子路徑,使用起來比較靈活,可以把路徑單獨作為參數傳遞過來
File(String pathname)
傳遞路徑名:可以寫檔案夾,也可以寫到一個檔案
c:\\abc c:\\abc\\Demo.java
路徑存不存在都可以建立,路徑不區分大小寫
1 public static void main(String[] args) { 2 /* 3 * static String pathSeparator 與系統有關的路徑分隔字元,為了方便,它被表示為一個字串。 4 * static char pathSeparatorChar 與系統有關的路徑分隔字元。 5 * static String separator 與系統有關的預設名稱分隔字元,為了方便,它被表示為一個字串。 6 * static char separatorChar 與系統有關的預設名稱分隔字元。 7 */ 8 String pathSeparator = File.pathSeparator; 9 System.out.println(pathSeparator);//路徑分隔字元 windows 分號; linux 冒號:10 11 String separator = File.separator;12 System.out.println(separator);//目錄名稱分隔字元windows 反斜線\ linux 正斜杠/13 14 /*15 * System類中的方法16 * static String getProperty(String key) 擷取指定鍵指示的系統屬性。 17 * file.separator 檔案分隔字元(在 UNIX 系統中是“/”) 18 * path.separator 路徑分隔字元(在 UNIX 系統中是“:”) 19 * line.separator 行分隔字元(在 UNIX 系統中是“/n”) 20 */21 System.out.println(System.getProperty("file.separator"));22 System.out.println(System.getProperty("line.separator"));23 System.out.println(System.getProperty("path.separator"));24 }
File類的建立和刪除功能
File 類的刪除功能
boolean delete()
刪除檔案或者檔案夾,在 File 構造方法中給出
刪除成功返回 true,刪除失敗返回 false(不存在,檔案夾中有內容)
刪除方法不走資源回收筒,直接從硬碟刪除
刪除有風險,運行需謹慎
File 建立檔案夾功能
boolean mkdir() 只能建立單層檔案夾
boolean mkdirs() 既能建立單層檔案夾,又能建立多層檔案夾
建立的路徑也在 File 構造方法中給出
如果檔案夾已經存在,不在建立
File 建立檔案的功能
boolean createNewFile()
建立的檔案路徑和檔案名稱,在 File 構造方法中給出
如果檔案已經存在,不在建立返回 false
只能建立檔案,不能建立檔案夾(看類型,不要看尾碼)
建立檔案夾的路徑,必須存在
File類的判斷功能
boolean isDirectory()
判斷 File 構造方法中封裝的路徑是不是檔案夾
如果是檔案夾就返回 true,如果不是檔案夾就返回 false
boolean isFile()
判斷 File 構造方法中封裝的路徑是不是檔案
boolean exists()
判斷 File 構造方法中封裝路徑是否存在
存在就返回 true,不存在就返回 false
File類的擷取功能
String getParent() 返回 String 對象
File getParentFile() 返回 File 對象
擷取父路徑,返回的是檔案末尾的父路徑
long length()
返迴路徑中表示的檔案的位元組數,檔案夾沒有大小
String getPath() 將此抽象路徑名轉換為一個路徑名字串。
和 toString 一樣
String getName()
返迴路徑中表示的檔案或者檔案夾名
擷取路徑中最後部分的名字
File getAbsoluteFile() 返回此抽象路徑名的絕對路徑名形式。
String getAbsolutePath() 返回此抽象路徑名的絕對路徑名字串。
擷取絕對路徑
遍曆目錄的方法list和listFiles
注意事項:
1.被遍曆的路徑只能是一個目錄
2.被遍曆的目錄必須存在
否則就會拋null 指標異常
static File[] listRoots()
擷取系統中所有根目錄
File[] listFiles()
擷取到 File 構造方法中封裝的路徑中的檔案和檔案夾名(遍曆一個目錄)
返回的是目錄或者檔案的全路徑
String[] list()
擷取到 File 構造方法中封裝的路徑中的檔案和檔案夾名(遍曆一個目錄)
返回的只有名字
遞迴
遞迴:方法自己調用自己
分類:
遞迴分為兩種,直接遞迴和間接遞迴。
直接遞迴稱為方法自身調用自己。間接遞迴可以A方法調用B方法,B方法調用C方法,C方法調用A方法。
注意:
1.遞迴一定要有條件限定,保證遞迴能夠停止下來,否則會發生棧記憶體溢出。
2.在遞迴中雖然有限定條件,但是遞迴次數不能太多。否則也會發生棧記憶體溢出。
3.構造方法,禁止遞迴
1 使用遞迴計算1-n之間的和 2 n + (n-1)+ (n-2)+(n-3)+...+1 3 5 +(5-1)+(4-1)+(3-1)+(2-1) 4 結束條件:n=1的時候結束 5 方法自己調用自己目的:擷取n-1,擷取到n=1的時候結束 6 public static int DGSum(int n){ 7 //添加結束條件 8 if(n==1){ 9 return 1;10 }11 return n+DGSum(n-1);12 } 13 14 使用遞迴計算階乘15 private static long DGJC(int n) {16 //遞迴的結束條件 n==117 if(n==1){18 return 1;19 }20 return n*DGJC(n-1);21 }22 23 使用遞迴計算斐波那契數列 24 private static int fbnq(int month) {25 //結束條件如果month是1,2直接返回126 if(month==1 || month==2){27 return 1;28 }29 //3月以上:兔子數量是前兩個月之和30 return fbnq(month-1)+fbnq(month-2);31 }
檔案過濾器
檔案的過濾器:
需求:遍曆hello檔案夾,只擷取檔案夾中的.java結尾的檔案
c:\\hello
c:\\hello\\demo.txt
c:\\hello\\Hello.java
在File類中listFiles()方法是遍曆檔案夾的方法
有兩個和 listFiles重載的方法,參數傳遞的就是過濾器
File[] listFiles(FileFilter filter)
File[] listFiles(FilenameFilter filter)
返回抽象路徑名數組,這些路徑名表示此抽象路徑名表示的目錄中滿足指定過濾器的檔案和目錄。
探索方法的參數FileFilter和FilenameFilter是介面
所有我們需要自己定義介面的實作類別,重寫介面中的方法accept,實現過濾功能
1 public class FileFilterImpl implements FileFilter{ 2 /* 3 * 實現過濾的方法: 4 1.把傳遞過來的路徑pathname,變成字串 5 Stirng s = pathname.toString(); "c:\\hello\\demo.txt" 6 String s = pathname.getPaht(); "c:\\hello\\demo.txt" 7 String s = pathname.getName(); "demo.txt" 8 2.使用String類中的方法endsWith判斷字串是否以指定的字串結尾 9 boolean b = s.endsWith(".java");10 return b;11 */12 @Override13 public boolean accept(File pathname) {14 /*String s = pathname.getName();15 boolean b = s.endsWith(".java");16 return b;*/17 return pathname.getName().toLowerCase().endsWith(".java");18 }19 }20 public class FilenameFilterImpl implements FilenameFilter{21 22 @Override23 public boolean accept(File dir, String name) {24 return name.toUpperCase().endsWith(".JAVA");25 }26 27 }
斷點調試
debug斷點調試
f6:逐行執行
f5:進入到方法中
f7:結束方法
f8:跳到下一個斷點
watch:捕獲