目錄
[TOC]
第一章:File類
1.1 File類介紹
? java.io.File 類是文件和目錄路徑名的抽象表示逗嫡,主要用于文件和目錄的創(chuàng)建、查找和刪除等操作葫隙。
1.2 構(gòu)造方法
-
語(yǔ)法
-
public File(String pathname)
:通過(guò)將給定的路徑名字符串轉(zhuǎn)換為抽象路徑名來(lái)創(chuàng)建新的 File實(shí)例栽烂。 -
public File(String parent, String child)
:從父路徑名字符串和子路徑名字符串創(chuàng)建新的 File實(shí)例。 -
public File(File parent, String child)
:從父抽象路徑名和子路徑名字符串創(chuàng)建新的 File實(shí)例恋脚。
-
-
代碼
// 創(chuàng)建File對(duì)象-方式1 File file1 = new File("D:\\JavaCode\\BasicCode\\a"); System.out.println(file1); // 創(chuàng)建File對(duì)象-方式2 File file2 = new File("D:\\JavaCode\\BasicCode\\a","1.txt"); System.out.println(file2); // 創(chuàng)建File對(duì)象-方式3 File file3 = new File(file1,"1.txt"); System.out.println(file3);
-
注意事項(xiàng)
- 一個(gè)File對(duì)象代表硬盤(pán)中實(shí)際存在的一個(gè)文件或者目錄腺办。
- 無(wú)論該路徑下是否存在文件或者目錄,都不影響File對(duì)象的創(chuàng)建
1.3 File類靜態(tài)成員
-
靜態(tài)成員
-
public static final String pathSeparator
- 與系統(tǒng)有關(guān)的路徑分隔符糟描。
-
public static final String separator
- 獲取與系統(tǒng)有關(guān)的默認(rèn)名稱分隔符怀喉。
-
-
代碼
System.out.println(File.pathSeparator); // ";" System.out.println(File.separator); // "/" // 注意:不同的操作系統(tǒng)獲取的分隔符是不一樣的
1.4 常用方法
-
獲取功能-相關(guān)方法
-
方法
-
public String getAbsolutePath()
:返回此File的絕對(duì)路徑名字符串。 -
public String getPath()
:將此File轉(zhuǎn)換為路徑名字符串船响。 -
public String getName()
:返回由此File表示的文件或目錄的名稱躬拢。 -
public long length()
:返回由此File表示的文件的長(zhǎng)度。
-
-
代碼
public static void main(String[] args) { // 1. `public String getAbsolutePath() `:返回此File的絕對(duì)路徑名字符串见间。 show1(); // 2. `public String getPath()` :將此File轉(zhuǎn)換為路徑名字符串聊闯。 show2(); // 3. `public String getName() `:返回由此File表示的文件或目錄的名稱。 show3(); // 4. `public long length() `:返回由此File表示的文件的長(zhǎng)度(文件的大小) show4(); } private static void show4() { // 不存在的文件夾或不存在的文件或存在的文件夾返回的都是0 File file1 = new File("D:\\JavaCode\\BasicCode\\a"); System.out.println(file1.length()); // 0 File file3 = new File("D:\\JavaCode\\BasicCode\\aa"); System.out.println(file3.length()); //0 File file2 = new File("D:\\JavaCode\\BasicCode\\a\\logo01.png"); System.out.println(file2.length()); //11610 字節(jié) } private static void show3() { File file1 = new File("D:\\JavaCode\\BasicCode\\a"); System.out.println(file1.getName()); // a File file2 = new File("1.txt"); // 1.txt System.out.println(file2.getName()); } private static void show2() { // 文件路徑是什么就返回什么 File file1 = new File("D:\\JavaCode\\BasicCode\\1.txt"); System.out.println(file1.getPath()); // D:\JavaCode\BasicCode\1.txt File file2 = new File("1.txt"); // 1.txt System.out.println(file2.getPath()); } private static void show1() { File file1 = new File("D:\\JavaCode\\BasicCode\\1.txt"); System.out.println(file1.getAbsoluteFile()); // D:\JavaCode\BasicCode\1.txt File file2 = new File("1.txt"); // D:\JavaCode\BasicCode\1.txt System.out.println(file2.getAbsoluteFile()); }
-
-
絕對(duì)路徑和相對(duì)路徑
- 絕對(duì)路徑:從盤(pán)符開(kāi)始的路徑米诉,這是一個(gè)完整的路徑菱蔬。
- 相對(duì)路徑:相對(duì)于項(xiàng)目目錄的路徑,這是一個(gè)便捷的路徑荒辕,開(kāi)發(fā)中經(jīng)常使用汗销。
-
判斷功能-相關(guān)方法
-
方法
-
public boolean exists()
:此File表示的文件或目錄是否實(shí)際存在。 -
public boolean isDirectory()
:此File表示的是否為目錄(目錄實(shí)際存在)抵窒。 -
public boolean isFile()
:此File表示的是否為文件(文件實(shí)際存在)弛针。
-
-
代碼
File file1 = new File("a"); // 1. `public boolean exists()` :此File表示的文件或目錄是否實(shí)際存在。 System.out.println(file1.exists()); // true // 2. `public boolean isDirectory()` :此File表示的是否為目錄李皇。 System.out.println(file1.isDirectory()); // true // 3. `public boolean isFile()` :此File表示的是否為文件削茁。 System.out.println(file1.isFile()); // false
-
-
創(chuàng)建刪除功能-相關(guān)方法
-
方法
-
public boolean createNewFile()
:當(dāng)且僅當(dāng)具有該名稱的文件尚不存在時(shí),創(chuàng)建一個(gè)新的空文件掉房。 -
public boolean delete()
:刪除由此File表示的文件或目錄茧跋。 -
public boolean mkdir()
:創(chuàng)建由此File表示的目錄。 -
public boolean mkdirs()
:創(chuàng)建由此File表示的目錄卓囚,包括任何必需但不存在的父目錄瘾杭。
-
-
代碼
public static void main(String[] args) throws IOException { // 1. `public boolean createNewFile()` :當(dāng)且僅當(dāng)具有該名稱的文件尚不存在時(shí),創(chuàng)建一個(gè)新的空文件哪亿。 File file1 = new File("a"); // 已經(jīng)存在的文件目錄 System.out.println(file1.createNewFile()); // false File file2 = new File("b"); // 不存在的文件 System.out.println(file2.createNewFile()); // true // 2. `public boolean delete() `:刪除由此File表示的文件或目錄粥烁。 File file3 = new File("c"); // 不存在的文件 System.out.println(file3.delete()); // false File file4 = new File("b"); // 不存在的文件 System.out.println(file4.delete()); // true // 3. `public boolean mkdir()` :創(chuàng)建由此File表示的目錄贤笆。 File file5 = new File("e"); // 不存在的文件目錄 System.out.println(file5.mkdir()); // true File file6 = new File("e//g/f"); // 多級(jí)文件目錄 System.out.println(file6.mkdir()); // false // 4. `public boolean mkdirs() `:創(chuàng)建由此File表示的目錄,包括任何必需但不存在的父目錄讨阻。 System.out.println(file6.mkdirs()); // true }
-
1.5 目錄的遍歷
-
方法
-
public String[] list()
:返回一個(gè)String數(shù)組芥永,表示該File目錄中的所有子文件或目錄。 -
public File[] listFiles()
:返回一個(gè)File數(shù)組钝吮,表示該File目錄中的所有的子文件或目錄埋涧。
-
-
代碼
// 1. `public String[] list()` :返回一個(gè)String數(shù)組,表示該File目錄中的所有子文件或目錄奇瘦。 File file1 = new File("D:\\JavaCode\\BasicCode"); String[]files = file1.list(); for (int i = 0; i < files.length; i++) { System.out.println(files[i]); } //2. `public File[] listFiles()` :返回一個(gè)File數(shù)組棘催,表示該File目錄中的所有的子文件或目錄。 File file2 = new File("D:\\JavaCode\\BasicCode"); File[]files2 = file2.listFiles(); for (int i = 0; i < files2.length; i++) { System.out.println(files2[i]); }
-
注意事項(xiàng)
- 調(diào)用listFiles方法的File對(duì)象耳标,表示的必須是實(shí)際存在的目錄巧鸭,否則返回null,無(wú)法進(jìn)行遍歷麻捻。
第二章:遞歸
2.1 遞歸介紹
- 遞歸,函數(shù)自身調(diào)用自身的編程技巧呀袱。
- 遞歸的分類:
- 直接遞歸稱為方法自身調(diào)用自己贸毕。
- 間接遞歸可以A方法調(diào)用B方法,B方法調(diào)用C方法夜赵,C方法調(diào)用A方法明棍。
- 遞歸注意事項(xiàng):
- 遞歸一定要有條件限定,保證遞歸能夠停止下來(lái)寇僧,否則會(huì)發(fā)生棧內(nèi)存溢出摊腋。
- 在遞歸中雖然有限定條件,但是遞歸次數(shù)不能太多嘁傀。否則也會(huì)發(fā)生棧內(nèi)存溢出兴蒸。
- 構(gòu)造方法,禁止遞歸
2.2 遞歸練習(xí)1
需求:計(jì)算數(shù)字1 ~ n的和
分析:num的累和 = num + (num-1)的累和,所以可以把累和的操作定義成一個(gè)方法细办,遞歸調(diào)用橙凳。
-
代碼:
// 計(jì)算數(shù)字1 ~ n的和 public static void main(String[] args) { int sum = getSum(3); System.out.println(sum); } private static int getSum(int n) { // 判斷遞歸結(jié)束條件 if(n==1) { return 1; } // 遞歸任務(wù) return n + getSum(n-1); }
-
圖解:
2.3 遞歸練習(xí)2
-
需求:階乘所有小于及等于該數(shù)的正整數(shù)的積。
n的階乘:n! = n * (n‐1) *...* 3 * 2 * 1 x
-
分析:這與累和類似,只不過(guò)換成了乘法運(yùn)算
- 推理得出:
n! = n * (n‐1)!
- 推理得出:
-
代碼
public static void main(String[] args) { int result = factorial(3); System.out.println(result); } private static int factorial(int n) { if(n==1) { return 1; } return n * factorial(n-1); }
2.4 遞歸練習(xí)3
需求:打印多級(jí)目錄及文件
-
代碼:
public static void main(String[] args) { File file = new File("D:\\JavaCode\\BasicCode\\dir"); readFile(file); } // 定義讀取目錄文件的方法 private static void readFile(File file) { // 獲取子文件和子目錄 File[]files = file.listFiles(); // 循環(huán)遍歷子文件和子目錄 for (File f : files) { if(f.isDirectory()){ readFile(f); }else { System.out.println(f); } } }
2.5 遞歸練習(xí)4
需求: 給一個(gè)指定的目錄笑撞,遞歸實(shí)現(xiàn)過(guò)濾出該目錄中所有的以及嵌套目中.java文件
-
代碼:
public static void main(String[] args) { File file = new File("D:\\JavaCode\\BasicCode"); readFile(file); } // 定義讀取目錄文件的方法 private static void readFile(File file) { // 獲取子文件和子目錄 File[]files = file.listFiles(); // 循環(huán)遍歷子文件和子目錄 for (File f : files) { if(f.isDirectory()){ readFile(f); }else { if(f.getName().toLowerCase().endsWith(".java")){ System.out.println(f); } } } }
2.6 文件過(guò)濾器
? java.io.FileFilter
是一個(gè)接口岛啸,是File的過(guò)濾器。 該接口的對(duì)象可以傳遞給File類的 listFiles(FileFilter)
方法作為參數(shù)茴肥, 接口中只有一個(gè)方法坚踩。
? boolean accept(File pathname)
:測(cè)試pathname是否應(yīng)該包含在當(dāng)前File目錄中,符合則返回true瓤狐。 ?
需求:和上述練習(xí)4一樣
-
分析:
接口作為參數(shù)瞬铸,需要傳遞子類對(duì)象批幌,重寫(xiě)其中方法。我們選擇匿名內(nèi)部類方式赴捞,比較簡(jiǎn)單逼裆。
-
accept 方法,參數(shù)為File赦政,表示當(dāng)前File下所有的子文件和子目錄胜宇。保留住則返回true,過(guò)濾掉則返回 false恢着。保留規(guī)則:
- 要么是.java文件桐愉。
- 要么是目錄,用于繼續(xù)遍歷掰派。
-
通過(guò)過(guò)濾器的作用从诲, listFiles(FileFilter) 返回的數(shù)組元素中,子文件對(duì)象都是符合條件的靡羡,可以直接打
印系洛。
-
代碼1:匿名內(nèi)部類
public static void main(String[] args) { File file = new File("D:\\JavaCode\\BasicCode"); readFile(file); } // 定義讀取目錄文件的方法 private static void readFile(File file) { // 獲取子文件和子目錄 File[]files = file.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { // 符合條件的File return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java"); } }); // 循環(huán)遍歷子文件和子目錄 for (File f : files) { if(f.isFile()){ System.out.println(f); }else { readFile(f); } } }
-
代碼2:Lambda表達(dá)式
public static void main(String[] args) { File file = new File("D:\\JavaCode\\BasicCode"); readFile(file); } // 定義讀取目錄文件的方法 private static void readFile(File file) { // 獲取子文件和子目錄 File[]files = file.listFiles(pathname -> pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java")); // 循環(huán)遍歷子文件和子目錄 for (File f : files) { if(f.isFile()){ System.out.println(f); }else { readFile(f); } } }