File類:
用來將文件或者文件夾封裝成對象
方便對文件或者文件夾的操作
File對象可以作為參數傳遞給一個流.
遞歸:
函數自己調用自己
應用場景:
當某一個功能需要重復調用..
1.遍歷一個文件,并且讓讓這個文件寫入到一個文本里面,(需要樹狀的排序)
1 package com.javami.kudy.CodeAM; 2 import java.io.BufferedWriter; 3 import java.io.IOException; 4 import java.io.File; 5 /* 6 * getSpace 7 * listAllFiles 8 */ 9 public class FileList { 10 public static void main(String[]args) 11 { 12 File file = new File("F:/test"); 13 BufferedWriter bw = null; 14 int val = 0; //默認為零 15 listAllFiles(file,val); 16 } 17 18 /* 19 *遍歷出所有文件夾和文件,用到ListFiles() 20 *2.利用增強for遍歷所有的目錄下的文件和文件夾() 21 *3.輸出文件的絕對路徑 22 *4.如果是目錄的,咱們就遞歸 23 * 24 * 25 */ 26 private static void listAllFiles(File dir,int val) 27 { 28 File[] files = dir.listFiles(); 29 for(File file : files) 30 { 31 System.out.println(getSpace(val)+file.getAbsolutePath()); 32 if(file.isDirectory())//當你迭代到沒有目錄的時候,就結束. 33 { 34 listAllFiles(file,val+1); //首先從這里邊標記一下+多少個 35 } 36 } 37 } 38 39 private static String getSpace(int val) 40 { 41 String line = "-|"; 42 for(int i=0; i<val; i++) 43 { 44 line+="-"; 45 } 46 return line; 47 } 48 }
2.刪除一個目錄(利用遞歸實現)
1 package com.javami.kudy.CodeAM; 2 import java.io.File; 3 public class DeleteDirTest { 4 /* 5 * 刪除一個目錄 6 * (注意: 首先要把里面的文件刪除才可以刪除一個目錄) 7 * delete(刪除抽象路徑名表示的目錄或者文件) 8 * 思路: 9 * 首先判斷如果是否是目錄(遞歸,利用listFiles是一個抽象的文件路徑),如果不是目錄.就直接刪除. 10 */ 11 public static void main(String[]args) 12 { 13 File f = new File("F:/復件 復件 a"); 14 deleteDir(f); 15 } 16 17 private static void deleteDir(File f) 18 { 19 if(f.isDirectory()) //判斷是否是一個目錄 //遞歸完是會出來的 20 { 21 File [] files = f.listFiles(); //如果是目錄,遞歸/找里面的目錄執行重復一個過程 22 for(File file : files) // a / b / cc a / b 23 { 24 deleteDir(file); //遞歸最終都是會走出來的 25 } 26 } 27 f.delete(); //我不管你是目錄還是什么.都給我刪除 28 } 29 }
3.指定一個目錄,把java文件寫入到一個文本里面去. 集合 寫入..
1 package com.javami.kudy.CodeAM; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.File; 6 import java.io.FileWriter; 7 import java.io.IOException; 8 import java.io.InputStreamReader; 9 import java.util.ArrayList; 10 public class javaFileList { 11 private static int val; 12 13 14 /* 15 * 指定一個目錄,把java文件寫入到一個文本里面去. 16 * 必須要利用過濾器功能去實現 17 * 要實現一個規范化 18 * 19 * 總結: 注意流的寫法,如果寫流的,必須要在外面正確創建,才可以正確關閉流. 20 * 要不然刷新不了 - - !懂了..有收獲了... 21 */ 22 public static void main(String[]args) 23 { 24 ArrayList<File> al = new ArrayList<File>(); 25 BufferedReader br = null; 26 BufferedWriter bw = null; 27 int val = 0; 28 try 29 { 30 br = new BufferedReader(new InputStreamReader(System.in)); 31 bw = new BufferedWriter(new FileWriter("src/369.txt")); 32 javaArrList(getDir(br),al,val); 33 listFilePath(al,bw); 34 } 35 catch(IOException e) 36 { 37 e.printStackTrace(); 38 } 39 finally 40 { 41 try 42 { 43 CloseUtil.close(br, bw); 44 } 45 catch(IOException e) 46 { 47 e.printStackTrace(); 48 } 49 } 50 51 } 52 53 54 /* 55 * 1.樹形結構 56 */ 57 private static String getSpack(int val) { 58 String spack = "-|"; 59 for(int i=0 ;i<val; i++) 60 { 61 spack+="-"; 62 } 63 return spack; 64 } 65 66 /* 67 * 2.請用戶輸入一個路徑 68 */ 69 private static File getDir(BufferedReader br) throws IOException 70 { 71 72 String dir = null; 73 System.out.println("請輸入一個目錄:"); 74 while(true) 75 { 76 dir = br.readLine(); //讀取 77 /* 78 * 判斷它是否是一個目錄, 判斷這個文件夾是否存在 79 */ 80 File file = new File(dir); //封裝一個路徑 81 if(!file.exists()) 82 { 83 System.out.println("該文件不存在,請重新輸入"); 84 continue; 85 } 86 if(!file.isAbsolute()) 87 { 88 System.out.println("不是一個目錄,請重新輸入:"); 89 continue; 90 } 91 break; 92 } 93 return new File(dir); 94 } 95 96 /* 97 *第三: 把遞歸到的java文件保存到集合里面 98 */ 99 private static void javaArrList(File dir, ArrayList<File> al,int val) 100 { 101 File[] files = dir.listFiles(); 102 if(files ==null) 103 return ; 104 for(File file : files) 105 { 106 if(file.isDirectory()) //如果是一個目錄.咱們要遞歸它 107 javaArrList(file, al,val+1); 108 else if(file.getName().endsWith(".java")) 109 { 110 al.add(file); 111 }//如果里面的目錄名是以java為結尾的 就把它放到集合里面去 112 } 113 114 } 115 /* 116 * 第四.把集合寫入到一個文件里面 117 */ 118 private static void listFilePath(ArrayList<File> al,BufferedWriter bw) throws IOException{ 119 120 for(File f : al) 121 { 122 bw.write(getSpack(val)+f.getAbsolutePath()); 123 bw.newLine(); 124 // bw.flush(); 125 } 126 } 127 128 129 }
4.指定一個目錄,使其刪除:
1 package com.javami.kudy.CodeAM; 2 import java.io.BufferedReader; 3 import java.io.File; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 public class DeleteDirTest { 7 public static void main(String[]args) 8 { 9 /* 10 * 請輸入一個目錄,把目錄里面的內容刪除 11 * (空文件才可以刪除目錄) 12 */ 13 BufferedReader br = null; 14 try 15 { 16 br = 17 new BufferedReader(new InputStreamReader(System.in)); 18 deleteDir(getDir(br)); //刪除一個目錄 19 }catch(IOException e) 20 { 21 e.printStackTrace(); 22 } 23 finally 24 { 25 try 26 { 27 br.close(); 28 }catch(IOException e) 29 { 30 e.printStackTrace(); 31 } 32 } 33 } 34 35 /* 36 * 1.生成一個目錄 37 */ 38 private static File getDir(BufferedReader br)throws IOException { 39 String dir = null; 40 System.out.println("請輸入一個目錄:"); 41 while(true) 42 { 43 dir = br.readLine(); 44 File file = new File(dir); 45 if(!file.exists()){//判斷該文件是否存在 46 System.out.println("該文件不存在,請重新輸入:"); 47 continue; 48 } 49 if(!file.isDirectory()){ 50 System.out.println("該目錄不存在.請重新輸入:"); 51 continue; 52 } 53 break; 54 } 55 System.out.println("目錄已經成功創建"); 56 return new File(dir); 57 } 58 /* 59 * 2.刪除一個目錄 60 */ 61 private static void deleteDir(File dir) { 62 if(dir.isDirectory()) //首先判斷是否是目錄 63 { 64 File[] files = dir.listFiles(); //把目錄放到數組里面去 65 for(File file : files) //遍歷里面 的內容 66 { 67 deleteDir(file); //如果是目錄就遞歸 ,遞歸完畢最終會返回到跟目錄 68 } 69 } 70 dir.delete(); //這一步每次遞歸都會執行刪除一次.. 71 72 73 } 74 }
5.拷貝一個目錄:
1 package com.javami.kudy.CodeAM; 2 import java.io.BufferedInputStream; 3 import java.io.BufferedOutputStream; 4 import java.io.File; 5 import java.io.FileInputStream; 6 import java.io.FileOutputStream; 7 import java.io.IOException; 8 public class CopyDir { 9 public static void main(String[]args) 10 { 11 /* 12 * 拷貝一個目錄 13 * 1.首先要判斷是否是標準文件或者是一個目錄 14 * 如果是 在目標目錄下創建一個同名的目錄 15 * 遍歷目錄,遞歸,將目錄下的所有文件拷貝至新創建的目錄 16 * 如果是標準文件,在目標目錄下創建同名文件,通過IO流來進行拷貝. 17 */ 18 File a = new File("F:/a"); 19 File b = new File("F:/b"); 20 try 21 { 22 copyDir(a, b); 23 }catch(IOException e) 24 { 25 e.printStackTrace(); 26 } 27 } 28 29 private static void copyDir(File a, File b)throws IOException { 30 if(a.isDirectory()) //判斷是否是一個目錄 31 { 32 //如果是目錄,封裝新目錄的路徑 33 File newDir = new File(b,a.getName()); 34 //創建一個新目錄 35 newDir.mkdir(); 36 File[] files = a.listFiles(); //里面的路徑 37 for(File file : files) 38 { 39 copyDir(file, newDir); 40 } 41 }else //這里面的只有文件 42 { 43 File newFile = new File(b,a.getName()); //如果沒有這個文件.以下語句會創建一個空文件 44 newFile.createNewFile(); //如果沒有這個路徑,則創建的意思.名字以上 45 //把a目錄下面的文件寫入到b目錄下面來 46 copyFile(a,newFile); //a里面代表的是一個文件 newFile也是代表一個文件(等待寫入數據的) 47 } 48 } 49 50 /* 51 * 把a里面的文件復制到f里面去 52 * 53 */ 54 private static void copyFile(File a, File f) throws IOException 55 { 56 BufferedInputStream bis = null; 57 BufferedOutputStream bos = null; 58 try 59 { 60 //其實a里面封裝的假設是: f:a/1.txt 注意類型的關系(file文件可以直接仍進去.) 61 //不能寫成"a"這樣就是放了一個a路徑進去啦 62 // 63 bis = 64 new BufferedInputStream(new FileInputStream(a));//代表是a是一個文件 65 bos = 66 new BufferedOutputStream(new FileOutputStream(f)); //代表是一個同名的a文件,只不過是空的 67 int ch; 68 while((ch=bis.read())!=-1) 69 { 70 bos.write(ch); 71 } 72 }finally 73 { 74 try 75 { 76 if(bis!=null) 77 bis.close(); 78 } 79 finally 80 { 81 if(bos!=null) 82 bos.close(); 83 } 84 } 85 } 86 87 } 88 遍歷指定目錄下的所有java文件,拷貝到F盤下指定的一個目錄下. 如果是為java結尾的文件.咱們要把它的名字更改成jdk 89 90 package com.javami.kudy.CodeAM; 91 import java.io.BufferedReader; 92 import java.io.BufferedWriter; 93 import java.io.File; 94 import java.io.FileReader; 95 import java.io.FileWriter; 96 import java.io.IOException; 97 import java.io.InputStreamReader; 98 public class JavaFileCopy { 99 public static void main(String[]args) 100 { 101 try 102 { 103 listJAVAFile(getDir()); 104 } 105 catch(IOException e) 106 { 107 e.printStackTrace(); 108 } 109 } 110 111 112 /* 113 * 1.獲取到一個目錄 114 */ 115 private static File getDir()throws IOException 116 { 117 BufferedReader br = 118 new BufferedReader(new InputStreamReader(System.in)); 119 String dir = null; 120 System.out.println("請輸入一個目錄:"); 121 while(true) 122 { 123 dir = br.readLine(); 124 File file = new File(dir); //封裝一個這個路徑 125 if(!file.exists()) 126 { 127 System.out.println("該文件不存在!請重新輸入:"); 128 continue; 129 } 130 if(!file.isDirectory()) 131 { 132 System.out.println("該目錄不存在,請重新輸入:"); 133 continue; 134 } 135 break; 136 } 137 return new File(dir); 138 }
6.遍歷指定目錄下的所有java文件,拷貝到F盤下指定的一個目錄下. 如果是為java結尾的文件.咱們要把它的名字更改成jdk
1 package com.javami.kudy.CodeAM; 2 import java.io.BufferedReader; 3 import java.io.BufferedWriter; 4 import java.io.File; 5 import java.io.FileReader; 6 import java.io.FileWriter; 7 import java.io.IOException; 8 import java.io.InputStreamReader; 9 public class JavaFileCopy { 10 public static void main(String[]args) 11 { 12 try 13 { 14 listJAVAFile(getDir()); 15 } 16 catch(IOException e) 17 { 18 e.printStackTrace(); 19 } 20 } 21 22 23 /* 24 * 1.獲取到一個目錄 25 */ 26 private static File getDir()throws IOException 27 { 28 BufferedReader br = 29 new BufferedReader(new InputStreamReader(System.in)); 30 String dir = null; 31 System.out.println("請輸入一個目錄:"); 32 while(true) 33 { 34 dir = br.readLine(); 35 File file = new File(dir); //封裝一個這個路徑 36 if(!file.exists()) 37 { 38 System.out.println("該文件不存在!請重新輸入:"); 39 continue; 40 } 41 if(!file.isDirectory()) 42 { 43 System.out.println("該目錄不存在,請重新輸入:"); 44 continue; 45 } 46 break; 47 } 48 return new File(dir); 49 } 50 /* 51 * 遍歷所有目錄下的java文件. 52 */ 53 private static void listJAVAFile(File dir)throws IOException 54 { 55 File[] files = dir.listFiles(); 56 57 for(File file : files) 58 { 59 //如果是目錄,就遞歸. 60 if(file.isDirectory()) //判斷是否是目錄 61 { 62 listJAVAFile(file); 63 } 64 //如果是文件.并且是java為結尾的文件.獲取文件名,替換文件名,創建新文件 65 else if(file.getName().endsWith(".java")); //獲取這個文件名 66 { 67 //獲取到一個文件名 68 String fileName = file.getName(); 69 //把文件名修改成jdk 70 String newFileName = fileName.replaceAll(".java$", ".jdk"); 71 //從 f:/dj目錄下創建文件 72 File newFile = new File("f:/dj",newFileName); //XX.jdk 73 newFile.createNewFile(); //如果這個路徑不存在.存在一個與之同名的文件 //**.jdk結果 74 copyfile(file,newFile); 75 //file:是一個java文件 而newFile文件是一個為jdk為結果的文件 76 } 77 } 78 } 79 80 81 private static void copyfile(File file, File newFile)throws IOException 82 { 83 BufferedReader br = null; 84 BufferedWriter bw = null; 85 try 86 { 87 br = new BufferedReader(new FileReader(file));//file代表的是一個java的路徑 88 bw = new BufferedWriter(new FileWriter(newFile));//是一個jdk的file文件的復制品 89 String line = null; 90 while((line=br.readLine())!=null) 91 { 92 bw.write(line); 93 bw.newLine(); 94 } 95 }finally 96 { 97 try 98 { 99 CloseUtil.close(br, bw); 100 }catch(IOException e) 101 { 102 e.printStackTrace(); 103 } 104 } 105 } 106 }
這次學習個人的心得總結:
在這個關閉一個流上面有所收獲.第二: 必須要正確的了解遞歸,這個其實不難- >但要想從一個深入的角度去理解,應用.還是需要多加復習與鍛煉的,遞歸最主要的目前對于我個人了解:
判斷是否是一個目錄,判斷是否是一個文件夾 . 遞歸 : a --> b --> c它最終會返回最高處的那個目錄.
這里面寫一個簡單的遞歸.
1 package com.javami.kudy.CodeAM; 2 3 import java.io.File; 4 5 public class Test { 6 public static void main(String[]args) 7 { 8 /* 9 * 簡單的遞歸 10 */ 11 File file = new File("F:/a"); 12 listArr(file); 13 14 } 15 public static void listArr(File file) 16 { 17 File[]files = file.listFiles(); 18 for(File f : files) 19 { 20 //判斷是否是一個目錄 21 if(f.isDirectory()) 22 { 23 listArr(f);//注意遞歸 24 } 25 System.out.println(f.getAbsolutePath()); //如果不是目錄.就輸出 26 } 27 } 28 }