File(掌握)
(1)IO流操作中大部分都是對文件的操作,所以Java就提供了File類供我們來操作文件
(2)構造方法
A:File file = new File("e:\\demo\\a.txt");
B:File file = new File("e:\\demo","a.txt");
C:File file = new File("e:\\demo");
File file2 = new File(file,"a.txt");
Demo:
import java.io.File; /* * 我們要想實現IO的操作,就必須知道硬盤上文件的表現形式。 * 而Java就提供了一個類File供我們使用。 * * File:文件和目錄(文件夾)路徑名的抽象表示形式 * 構造方法: * File(String pathname):根據一個路徑得到File對象 * File(String parent, String child):根據一個目錄和一個子文件/目錄得到File對象 * File(File parent, String child):根據一個父File對象和一個子文件/目錄得到File對象 */ public class FileDemo { public static void main(String[] args) { // File(String pathname):根據一個路徑得到File對象 // 把e:\\demo\\a.txt封裝成一個File對象 File file = new File("E:\\demo\\a.txt"); // File(String parent, String child):根據一個目錄和一個子文件/目錄得到File對象 File file2 = new File("E:\\demo", "a.txt"); // File(File parent, String child):根據一個父File對象和一個子文件/目錄得到File對象 File file3 = new File("e:\\demo"); File file4 = new File(file3, "a.txt"); // 以上三種方式其實效果一樣 } }
(3)File類的功能(自己補齊)
A:創建功能
Demo:
import java.io.File; import java.io.IOException; /* *創建功能: *public boolean createNewFile():創建文件 如果存在這樣的文件,就不創建了 *public boolean mkdir():創建文件夾 如果存在這樣的文件夾,就不創建了 *public boolean mkdirs():創建文件夾,如果父文件夾不存在,會幫你創建出來 * *騎白馬的不一定是王子,可能是班長。 *注意:你到底要創建文件還是文件夾,你最清楚,方法不要調錯了。 */ public class FileDemo { public static void main(String[] args) throws IOException { // 需求:我要在e盤目錄下創建一個文件夾demo File file = new File("e:\\demo"); System.out.println("mkdir:" + file.mkdir()); // 需求:我要在e盤目錄demo下創建一個文件a.txt File file2 = new File("e:\\demo\\a.txt"); System.out.println("createNewFile:" + file2.createNewFile()); // 需求:我要在e盤目錄test下創建一個文件b.txt // Exception in thread "main" java.io.IOException: 系統找不到指定的路徑。 // 注意:要想在某個目錄下創建內容,該目錄首先必須存在。 // File file3 = new File("e:\\test\\b.txt"); // System.out.println("createNewFile:" + file3.createNewFile()); // 需求:我要在e盤目錄test下創建aaa目錄 // File file4 = new File("e:\\test\\aaa"); // System.out.println("mkdir:" + file4.mkdir()); // File file5 = new File("e:\\test"); // File file6 = new File("e:\\test\\aaa"); // System.out.println("mkdir:" + file5.mkdir()); // System.out.println("mkdir:" + file6.mkdir()); // 其實我們有更簡單的方法 File file7 = new File("e:\\aaa\\bbb\\ccc\\ddd"); System.out.println("mkdirs:" + file7.mkdirs()); // 看下面的這個東西: File file8 = new File("e:\\liuyi\\a.txt"); System.out.println("mkdirs:" + file8.mkdirs()); } }
B:刪除功能
Demo:
import java.io.File; import java.io.IOException; /* * 刪除功能:public boolean delete() * * 注意: * A:如果你創建文件或者文件夾忘了寫盤符路徑,那麼,默認在項目路徑下。 * B:Java中的刪除不走回收站。 * C:要刪除一個文件夾,請注意該文件夾內不能包含文件或者文件夾,如果有無法刪除 */ public class FileDemo { public static void main(String[] args) throws IOException { // 創建文件 // File file = new File("e:\\a.txt"); // System.out.println("createNewFile:" + file.createNewFile()); // 我不小心寫成這個樣子了 File file = new File("a.txt"); System.out.println("createNewFile:" + file.createNewFile()); // 繼續玩幾個 File file2 = new File("aaa\\bbb\\ccc"); System.out.println("mkdirs:" + file2.mkdirs()); // 刪除功能:我要刪除a.txt這個文件 File file3 = new File("a.txt"); System.out.println("delete:" + file3.delete()); // 刪除功能:我要刪除ccc這個文件夾 File file4 = new File("aaa\\bbb\\ccc"); System.out.println("delete:" + file4.delete()); // 刪除功能:我要刪除aaa文件夾 // File file5 = new File("aaa"); // System.out.println("delete:" + file5.delete()); File file6 = new File("aaa\\bbb"); File file7 = new File("aaa"); System.out.println("delete:" + file6.delete()); System.out.println("delete:" + file7.delete()); } }
C:重命名功能
Demo:
import java.io.File; /* * 重命名功能:public boolean renameTo(File dest) * 如果路徑名相同,就是改名。 * 如果路徑名不同,就是改名並剪切。 * * 路徑以盤符開始:絕對路徑 c:\\a.txt * 路徑不以盤符開始:相對路徑 a.txt */ public class FileDemo { public static void main(String[] args) { // 創建一個文件對象 // File file = new File("林青霞.jpg"); // // 需求:我要修改這個文件的名稱爲"東方不敗.jpg" // File newFile = new File("東方不敗.jpg"); // System.out.println("renameTo:" + file.renameTo(newFile)); File file2 = new File("東方不敗.jpg"); File newFile2 = new File("e:\\林青霞.jpg"); System.out.println("renameTo:" + file2.renameTo(newFile2)); } }
D:判斷功能
Demo:
import java.io.File; /* * 判斷功能: * public boolean isDirectory():判斷是否是目錄 * public boolean isFile():判斷是否是文件 * public boolean exists():判斷是否存在 * public boolean canRead():判斷是否可讀 * public boolean canWrite():判斷是否可寫 * public boolean isHidden():判斷是否隱藏 */ public class FileDemo { public static void main(String[] args) { // 創建文件對象 File file = new File("a.txt"); System.out.println("isDirectory:" + file.isDirectory());// false System.out.println("isFile:" + file.isFile());// true System.out.println("exists:" + file.exists());// true System.out.println("canRead:" + file.canRead());// true System.out.println("canWrite:" + file.canWrite());// true System.out.println("isHidden:" + file.isHidden());// false } }
E:獲取功能
Demo:
import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; /* * 獲取功能: * public String getAbsolutePath():獲取絕對路徑 * public String getPath():獲取相對路徑 * public String getName():獲取名稱 * public long length():獲取長度。字節數 * public long lastModified():獲取最後一次的修改時間,毫秒值 */ public class FileDemo { public static void main(String[] args) { // 創建文件對象 File file = new File("demo\\test.txt"); System.out.println("getAbsolutePath:" + file.getAbsolutePath()); System.out.println("getPath:" + file.getPath()); System.out.println("getName:" + file.getName()); System.out.println("length:" + file.length()); System.out.println("lastModified:" + file.lastModified()); // 1416471971031 Date d = new Date(1416471971031L); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String s = sdf.format(d); System.out.println(s); } }
F:高級獲取功能
Demo:
import java.io.File; /* * 獲取功能: * public String[] list():獲取指定目錄下的所有文件或者文件夾的名稱數組 * public File[] listFiles():獲取指定目錄下的所有文件或者文件夾的File數組 */ public class FileDemo { public static void main(String[] args) { // 指定一個目錄 File file = new File("e:\\"); // public String[] list():獲取指定目錄下的所有文件或者文件夾的名稱數組 String[] strArray = file.list(); for (String s : strArray) { System.out.println(s); } System.out.println("------------"); // public File[] listFiles():獲取指定目錄下的所有文件或者文件夾的File數組 File[] fileArray = file.listFiles(); for (File f : fileArray) { System.out.println(f.getName()); } } }
G:過濾器功能
(4)案例:
A:輸出指定目錄下指定後綴名的文件名稱
a:先獲取所有的,在遍歷的時候判斷,再輸出
Demo:
import java.io.File; /* * 判斷E盤目錄下是否有後綴名爲.jpg的文件,如果有,就輸出此文件名稱 * * 分析: * A:封裝e判斷目錄 * B:獲取該目錄下所有文件或者文件夾的File數組 * C:遍歷該File數組,得到每一個File對象,然後判斷 * D:是否是文件 * 是:繼續判斷是否以.jpg結尾 * 是:就輸出該文件名稱 * 否:不搭理它 * 否:不搭理它 */ public class FileDemo { public static void main(String[] args) { // 封裝e判斷目錄 File file = new File("e:\\"); // 獲取該目錄下所有文件或者文件夾的File數組 File[] fileArray = file.listFiles(); // 遍歷該File數組,得到每一個File對象,然後判斷 for (File f : fileArray) { // 是否是文件 if (f.isFile()) { // 繼續判斷是否以.jpg結尾 if (f.getName().endsWith(".jpg")) { // 就輸出該文件名稱 System.out.println(f.getName()); } } } } }
b:先判斷,再獲取,最後直接遍歷輸出即可
Demo:
import java.io.File; import java.io.FilenameFilter; /* * 判斷E盤目錄下是否有後綴名爲.jpg的文件,如果有,就輸出此文件名稱 * A:先獲取所有的,然後遍歷的時候,依次判斷,如果滿足條件就輸出。 * B:獲取的時候就已經是滿足條件的了,然後輸出即可。 * * 要想實現這個效果,就必須學習一個接口:文件名稱過濾器 * public String[] list(FilenameFilter filter) * public File[] listFiles(FilenameFilter filter) */ public class FileDemo2 { public static void main(String[] args) { // 封裝e判斷目錄 File file = new File("e:\\"); // 獲取該目錄下所有文件或者文件夾的String數組 // public String[] list(FilenameFilter filter) String[] strArray = file.list(new FilenameFilter() { @Override public boolean accept(File dir, String name) { // return false; // return true; // 通過這個測試,我們就知道了,到底把這個文件或者文件夾的名稱加不加到數組中,取決於這裏的返回值是true還是false // 所以,這個的true或者false應該是我們通過某種判斷得到的 // System.out.println(dir + "---" + name); // File file = new File(dir, name); // // System.out.println(file); // boolean flag = file.isFile(); // boolean flag2 = name.endsWith(".jpg"); // return flag && flag2; return new File(dir, name).isFile() && name.endsWith(".jpg"); } }); // 遍歷 for (String s : strArray) { System.out.println(s); } } }
B:批量修改文件名稱
Demo:
import java.io.File; /* * 需求:把E:\評書\三國演義下面的視頻名稱修改爲 * 00?_介紹.avi * * 思路: * A:封裝目錄 * B:獲取該目錄下所有的文件的File數組 * C:遍歷該File數組,得到每一個File對象 * D:拼接一個新的名稱,然後重命名即可。 */ public class FileDemo { public static void main(String[] args) { // 封裝目錄 File srcFolder = new File("E:\\評書\\三國演義"); // 獲取該目錄下所有的文件的File數組 File[] fileArray = srcFolder.listFiles(); // 遍歷該File數組,得到每一個File對象 for (File file : fileArray) { // System.out.println(file); // E:\評書\三國演義\三國演義_001_[評書網-今天很高興,明天就IO了]_桃園三結義.avi // 改後:E:\評書\三國演義\001_桃園三結義.avi String name = file.getName(); // 三國演義_001_[評書網-今天很高興,明天就IO了]_桃園三結義.avi int index = name.indexOf("_"); String numberString = name.substring(index + 1, index + 4); // System.out.println(numberString); // int startIndex = name.lastIndexOf('_'); // int endIndex = name.lastIndexOf('.'); // String nameString = name.substring(startIndex + 1, endIndex); // System.out.println(nameString); int endIndex = name.lastIndexOf('_'); String nameString = name.substring(endIndex); String newName = numberString.concat(nameString); // 001_桃園三結義.avi // System.out.println(newName); File newFile = new File(srcFolder, newName); // E:\\評書\\三國演義\\001_桃園三結義.avi // 重命名即可 file.renameTo(newFile); } } }
###########################################################################################
1:遞歸(理解)
(1)方法定義中調用方法本身的現象
舉例:老和尚給小和尚講故事,我們學編程
(2)遞歸的注意事項;
A:要有出口,否則就是死遞歸
B:次數不能過多,否則內存溢出
C:構造方法不能遞歸使用
(3)遞歸的案例:
A:遞歸求階乘
Demo:
/* * 需求:請用代碼實現求5的階乘。 * 下面的知識要知道: * 5! = 1*2*3*4*5 * 5! = 5*4! * * 有幾種方案實現呢? * A:循環實現 * B:遞歸實現 * a:做遞歸要寫一個方法 * b:出口條件 * c:規律 */ public class DiGuiDemo { public static void main(String[] args) { int jc = 1; for (int x = 2; x <= 5; x++) { jc *= x; } System.out.println("5的階乘是:" + jc); System.out.println("5的階乘是:"+jieCheng(5)); } /* * 做遞歸要寫一個方法: * 返回值類型:int * 參數列表:int n * 出口條件: * if(n == 1) {return 1;} * 規律: * if(n != 1) {return n*方法名(n-1);} */ public static int jieCheng(int n){ if(n==1){ return 1; }else { return n*jieCheng(n-1); } } }
B:兔子問題
Demo:
/* * 有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問第二十個月的兔子對數爲多少? * 分析:我們要想辦法找規律 * 兔子對數 * 第一個月: 1 * 第二個月: 1 * 第三個月: 2 * 第四個月: 3 * 第五個月: 5 * 第六個月: 8 * ... * * 由此可見兔子對象的數據是: * 1,1,2,3,5,8... * 規則: * A:從第三項開始,每一項是前兩項之和 * B:而且說明前兩項是已知的 * * 如何實現這個程序呢? * A:數組實現 * B:變量的變化實現 * C:遞歸實現 * * 假如相鄰的兩個月的兔子對數是a,b * 第一個相鄰的數據:a=1,b=1 * 第二個相鄰的數據:a=1,b=2 * 第三個相鄰的數據:a=2,b=3 * 第四個相鄰的數據:a=3,b=5 * 看到了:下一次的a是以前的b,下一次是以前的a+b */ public class DiGuiDemo2 { public static void main(String[] args) { // 定義一個數組 int[] arr = new int[20]; arr[0] = 1; arr[1] = 1; // arr[2] = arr[0] + arr[1]; // arr[3] = arr[1] + arr[2]; // ... for (int x = 2; x < arr.length; x++) { arr[x] = arr[x - 2] + arr[x - 1]; } System.out.println(arr[19]);// 6765 System.out.println("----------------"); int a = 1; int b = 1; for (int x = 0; x < 18; x++) { // 臨時變量存儲上一次的a int temp = a; a = b; b = temp + b; } System.out.println(b); System.out.println("----------------"); System.out.println(fib(20)); } /* * 方法: 返回值類型:int 參數列表:int n 出口條件: 第一個月是1,第二個月是1 規律: 從第三個月開始,每一個月是前兩個月之和 */ public static int fib(int n) { if (n == 1 || n == 2) { return 1; } else { //從第三個月開始n月的總數爲上個月和上上個月的和 return fib(n - 1) + fib(n - 2); } } }
C:遞歸輸出指定目錄下所有指定後綴名的文件絕對路徑
Demo:
import java.io.File; /* * 需求:請大家把E:\JavaSE目錄下所有的java結尾的文件的絕對路徑給輸出在控制檯。 * * 分析: * A:封裝目錄 * B:獲取該目錄下所有的文件或者文件夾的File數組 * C:遍歷該File數組,得到每一個File對象 * D:判斷該File對象是否是文件夾 * 是:回到B * 否:繼續判斷是否以.java結尾 * 是:就輸出該文件的絕對路徑 * 否:不搭理它 */ public class FilePathDemo { public static void main(String[] args) { // 封裝目錄 File srcFolder = new File("E:\\JavaSE"); // 遞歸功能實現 getAllJavaFilePaths(srcFolder); } private static void getAllJavaFilePaths(File srcFolder) { // 獲取該目錄下所有的文件或者文件夾的File數組 File[] fileArray = srcFolder.listFiles(); // 遍歷該File數組,得到每一個File對象 for (File file : fileArray) { // 判斷該File對象是否是文件夾 if (file.isDirectory()) { getAllJavaFilePaths(file); } else { // 繼續判斷是否以.java結尾 if (file.getName().endsWith(".java")) { // 就輸出該文件的絕對路徑 System.out.println(file.getAbsolutePath()); } } } } }
D:遞歸刪除帶內容的目錄(小心使用)
Demo:
import java.io.File; /* * 需求:遞歸刪除帶內容的目錄 * * 目錄我已經給定:demo * * 分析: * A:封裝目錄 * B:獲取該目錄下的所有文件或者文件夾的File數組 * C:遍歷該File數組,得到每一個File對象 * D:判斷該File對象是否是文件夾 * 是:回到B * 否:就刪除 */ public class FileDeleteDemo { public static void main(String[] args) { // 封裝目錄 File srcFolder = new File("demo"); // 遞歸實現 deleteFolder(srcFolder); } private static void deleteFolder(File srcFolder) { // 獲取該目錄下的所有文件或者文件夾的File數組 File[] fileArray = srcFolder.listFiles(); if (fileArray != null) { // 遍歷該File數組,得到每一個File對象 for (File file : fileArray) { // 判斷該File對象是否是文件夾 if (file.isDirectory()) { deleteFolder(file); } else { System.out.println(file.getName() + "---" + file.delete()); } } System.out .println(srcFolder.getName() + "---" + srcFolder.delete()); } } }