今日內容介紹 java
File 數組
回想以前寫過的程序,數據都是在內存中,一旦程序運行結束,這些數據都沒有了,等下次再想使用這些數據,但是已經沒有了。那怎麼辦呢?能不能把運算完的數據都保存下來,下次程序啓動的時候,再把這些數據讀出來繼續使用呢?其實要把數據持久化存儲,就須要把內存中的數據存儲到內存之外的其餘持久化設備(硬盤、光盤、U盤等)上。ide
當須要把內存中的數據存儲到持久化設備上這個動做稱爲輸出(寫)Output操做。函數
當把持久設備上的數據讀取到內存中的這個動做稱爲輸入(讀)Input操做。測試
所以咱們把這種輸入和輸出動做稱爲IO操做。ui
簡單瞭解IO是怎麼一回事以後,接下來就要進一步作系統瞭解。spa
在咱們操做系統中,數據都保存在文件中,而文件存放相應的文件夾中。那麼Java中是如何描述這些的呢?操作系統
打開API,搜索File類。閱讀其描述:File文件和目錄路徑名的抽象表示形式。即,Java中把文件或者目錄(文件夾)都封裝成File對象。也就是說若是咱們要去操做硬盤上的文件,或者文件夾只要找到File這個類便可。那麼咱們就要研究研究File這個類中都有那些功能能夠操做文件或者文件夾呢?3d
public class FileDemo { public static void main(String[] args) { //File構造函數演示 String pathName = "e:\\java_code\\day22e\\hello.java"; File f1 = new File(pathName);//將Test22文件封裝成File對象。注意;有能夠封裝不存在文件或者文件夾,變成對象。 System.out.println(f1); File f2 = new File("e:\\java_code\\day22e","hello.java"); System.out.println(f2); //將parent封裝成file對象。 File dir = new File("e:\\java_code\\day22e"); File f3 = new File(dir,"hello.java"); System.out.println(f3); } }
建立完了File對象以後,那麼File類中都有以下經常使用方法,能夠獲取文件相關信息code
public class FileMethodDemo { public static void main(String[] args) { //建立文件對象 File file = new File("Test22.java"); //獲取文件的絕對路徑,即全路徑 String absPath = file.getAbsolutePath(); //File中封裝的路徑是什麼獲取到的就是什麼。 String path = file.getPath(); //獲取文件名稱 String filename = file.getName(); //獲取文件大小 long size = file.length(); System.out.println("absPath="+absPath); System.out.println("path="+path); System.out.println("filename="+filename); System.out.println("size="+size); } }
常常上面介紹,咱們知道能夠經過File獲取到文件名稱,文件路徑(目錄)等信息。
接下來演示使用File類建立、刪除文件等操做。
public class FileMethodDemo2 { public static void main(String[] args) throws IOException { // 對文件或者文件加進行操做。 File file = new File("e:\\file.txt"); // 建立文件,若是文件不存在,建立 true 若是文件存在,則不建立 false。若是路徑錯誤,IOException。 boolean b1 = file.createNewFile(); System.out.println("b1=" + b1); //-----------刪除文件操做-------注意:不去回收站。慎用------ boolean b2 = file.delete(); System.out.println("b2="+b2); //-----------須要判斷文件是否存在------------ boolean b3 = file.exists(); System.out.println("b3="+b3); //-----------對目錄操做建立,刪除,判斷------------ File dir = new File("e:\\abc"); //mkdir()建立單個目錄。//dir.mkdirs();建立多級目錄 boolean b4 = dir.mkdir(); System.out.println("b4="+b4); //刪除目錄時,若是目錄中有內容,沒法直接刪除。 boolean b5 = dir.delete(); //只有將目錄中的內容都刪除後,保證該目錄爲空。這時這個目錄才能夠刪除。 System.out.println("b5=" + b5); //-----------判斷文件,目錄------------ File f = new File("e:\\javahaha");// 要判斷是不是文件仍是目錄,必須先判斷存在。 // f.mkdir();//f.createNewFile(); System.out.println(f.isFile()); System.out.println(f.isDirectory()); } }
文件都存放在目錄(文件夾)中,那麼如何獲取一個目錄中的全部文件或者目錄中的文件夾呢?那麼咱們先想一想,一個目錄中可能有多個文件或者文件夾,那麼若是File中有功能獲取到一個目錄中的全部文件和文件夾,那麼功能獲得的結果要麼是數組,要麼是集合。咱們開始查閱API。
public class FileMethodDemo3 { public static void main(String[] args) { File dir = new File("e:\\java_code"); //獲取的是目錄下的當前的文件以及文件夾的名稱。 String[] names = dir.list(); for(String name : names){ System.out.println(name); } //獲取目錄下當前文件以及文件對象,只要拿到了文件對象,那麼就能夠獲取其中想要的信息 File[] files = dir.listFiles(); for(File file : files){ System.out.println(file); } } }
注意:在獲取指定目錄下的文件或者文件夾時必須知足下面兩個條件
1,指定的目錄必須是存在的,
2,指定的必須是目錄。不然容易引起返回數組爲null,出現NullPointerException
經過listFiles()方法,咱們能夠獲取到一個目錄下的全部文件和文件夾,但能不能對其進行過濾呢?好比咱們只想要一個目錄下的指定擴展名的文件,或者包含某些關鍵字的文件夾呢?
咱們是能夠先把一個目錄下的全部文件和文件夾獲取到,並遍歷當前獲取到全部內容,遍歷過程當中在進行篩選,可是這個動做有點麻煩,Java給咱們提供相應的功能來解決這個問題。
查閱File類的API,在查閱時發現File類中重載的listFiles方法,而且接受指定的過濾器。
public class FileDemo2 { public static void main(String[] args) { //獲取擴展名爲.java全部文件 //建立File對象 File file = new File("E:\\code\\day11_code"); //獲取指定擴展名的文件,因爲要對全部文件進行擴展名篩選,所以調用方法須要傳遞過濾器 File[] files = file.listFiles(new MyFileFilter()); //遍歷獲取到的全部符合條件的文件 for (File f : files) { System.out.println(f); } } }
//定義類實現文件名稱FilenameFilter過濾器 class MyFileFilter implements FilenameFilter{ public boolean accept(File dir, String name) { return name.endsWith(".java"); } }
在查閱API時,咱們發現,在listFiles(FileFilter filter) 也能夠接受一個FileFilter過濾器,它和咱們講的FilenameFilter有啥區別呢?
FilenameFilter過濾器中的accept方法接受兩個參數,一個當前文件或文件夾所在的路徑,一個是當前文件或文件夾對象的名稱。
FileFilter 過濾器中的accept方法接受一個參數,這個參數就當前文件或文件夾對象
當咱們須要過濾文件名稱時就可使用FilenameFilter這個過濾器,當咱們想對當前文件或文件夾進行過濾,就可使用FileFilter ,好比須要當前目錄下的全部文件夾,就可使用FileFilter 過濾器。
public class FileDemo2 { public static void main(String[] args) { //獲取擴展名爲.java全部文件 //建立File對象 File file = new File("E:\\code\\day11_code"); //獲取指定目錄下的文件夾 File[] files = file.listFiles(new FileFileterByDir()); //遍歷獲取到的全部符合條件的文件 for (File f : files) { System.out.println(f); } } }
//文件過濾器 class FileFileterByDir implements FileFilter{ public boolean accept(File pathname) { return pathname.isDirectory(); } }
遞歸,指在當前方法內調用本身的這種現象
public void method(){ System.out.println("遞歸的演示"); //在當前方法內調用本身 method(); }
遞歸分爲兩種,直接遞歸和間接遞歸。
直接遞歸稱爲方法自身調用本身。間接遞歸能夠A方法調用B方法,B方法調用C方法,C方法調用A方法。
public class DiGuiDemo { public static void main(String[] args) { //計算1~num的和,使用遞歸完成 int n = 5; int sum = getSum(n); System.out.println(sum); } public static int getSum(int n) { if(n == 1){ return 1; } return n + getSum(n-1); } }
注意:遞歸必定要有條件限定,保證遞歸可以中止下來,不然會發生棧內存溢出。
在遞歸中雖然有限定條件,可是遞歸次數不能太多。不然也會發生棧內存溢出。
編寫一個方法用來打印指定目錄中的文件路徑,並進行方法的調用
要求:若指定的目錄有子目錄,那麼把子目錄中的文件路徑也打印出來
步驟:
1. 指定要打印的目錄File對象
2. 調用getFileAll()方法
2.1 獲取指定目錄中的全部File對象
2.2 遍歷獲得每個File對象
2.3 判斷當前File 對象是不是目錄
判斷結果爲true,說明爲目錄,經過遞歸,再次調用步驟2的getFileAll()方法
判斷結果爲false,說明是文件,打印文件的路徑
public class FileDemo2 { public static void main(String[] args) { File file = new File("d:\\test"); getFileAll(file); } //獲取指定目錄以及子目錄中的全部的文件 public static void getFileAll(File file) { File[] files = file.listFiles(); //遍歷當前目錄下的全部文件和文件夾 for (File f : files) { //判斷當前遍歷到的是否爲目錄 if(f.isDirectory()){ //是目錄,繼續獲取這個目錄下的全部文件和文件夾 getFileAll(f); }else{ //不是目錄,說明當前f就是文件,那麼就打印出來 System.out.println(f); } } } }
需求:打印指定目錄即全部子目錄中的.java文件的文件路徑
要求:編寫一個方法用來打印指定目錄中的.java文件路徑,並進行方法的調用
若指定的目錄有子目錄,那麼把子目錄中的.java文件路徑也打印出來
步驟:
1. 指定要打印的目錄File對象
2. 調用getFileAll()方法,傳入要打印的目錄File對象
2.1 經過FilenameFilter過濾器獲取指定目錄中的全部.java類型的File對象
2.2 遍歷獲得每個File對象
2.3 判斷當前File 對象是不是目錄
判斷結果爲true,說明爲目錄,經過遞歸,再次調用步驟2的getFileAll()方法
判斷結果爲false,說明是文件,打印文件的路徑
public class FileDemo4 { public static void main(String[] args) { File file = new File("d:\\test"); getFileAll(file); } //獲取指定目錄以及子目錄中的全部的文件 public static void getFileAll(File file) { File[] files = file.listFiles(MyFileFilter()); //遍歷當前目錄下的全部文件和文件夾 for (File f : files) { //判斷當前遍歷到的是否爲目錄 if(f.isDirectory()){ //是目錄,繼續獲取這個目錄下的全部文件和文件夾 getFileAll(f); }else{ //不是目錄,說明當前f就是文件,那麼就打印出來 System.out.println(f); } } } }
//定義類實現文件名稱FilenameFilter過濾器 class MyFileFilter implements FilenameFilter{ public boolean accept(File dir, String name) { return name.endsWith(".java"); } }
public void methodA(){ methodA(); }
public void metohdB(){ methodC(); } public void methodC(){ methodB(); }
public File(String pathname) 經過給定的文件或文件夾的路徑,來建立對應的File對象
public File(String parent, String child) 經過給定的父文件夾路徑,與給定的文件名稱或目錄名稱來建立對應的File對象
public File(File parent, String child)經過給定的File對象的目錄路徑,與給定的文件夾名稱或文件名稱來建立對應的File對象
E:\Workspace\File\abc.txt
File\abc.txt
public boolean createNewFile()建立文件
public boolean mkdir() 建立單層文件夾
public boolean mkdirs() 建立多層文件夾
public boolean delete()
public boolean isDirectory() 判斷是否爲文件夾
public boolean isFile() 判斷是否爲文件
public boolean exists() 判斷File對象對應的文件或文件夾是否存在
public String getAbsolutePath() 獲取當前File的絕對路徑
public String getName() 獲取當前File對象的文件或文件夾名稱
public long length() 獲取當前File對象的文件或文件夾的大小(字節)
public File[] listFiles() 獲取File所表明目錄中全部文件或文件夾的絕對路徑