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