java----day22(IO流)
File
- IO概述
回想之前寫過的程式,資料都是在記憶體中,一旦程式執行結束,這些資料都沒有了,等下次再想使用這些資料,可是已經沒有了。那怎麼辦呢?能不能把運算完的資料都儲存下來,下次程式啟動的時候,再把這些資料讀出來繼續使用呢?其實要把資料持久化儲存,就需要把記憶體中的資料儲存到記憶體以外的其他持久化裝置(硬碟、光碟、U盤等)上。
當需要把記憶體中的資料儲存到持久化裝置上這個動作稱為輸出(寫)Output操作。
當把持久裝置上的資料讀取到記憶體中的這個動作稱為輸入(讀)Input操作。
因此我們把這種輸入和輸出動作稱為IO操作。
- File類的建構函式
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物件之後,那麼File類中都有如下常用方法,可以獲取檔案相關資訊
- 檔案和資料夾的建立刪除
經常上面介紹,我們知道可以通過File獲取到檔名稱,檔案路徑(目錄)等資訊。
接下來演示使用File類建立、刪除檔案等操作。
- ListFiles()方法介紹
檔案都存放在目錄(資料夾)中,那麼如何獲取一個目錄中的所有檔案或者目錄中的資料夾呢?那麼我們先想想,一個目錄中可能有多個檔案或者資料夾,那麼如果File中有功能獲取到一個目錄中的所有檔案和資料夾,那麼功能得到的結果要麼是陣列,要麼是集合。
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方法,並且接受指定的過濾器
在查閱API時,我們發現,在listFiles(FileFilter filter) 也可以接受一個FileFilter過濾器,它和我們講的FilenameFilter有啥區別呢?
FilenameFilter過濾器中的accept方法接受兩個引數,一個當前檔案或資料夾所在的路徑,一個是當前檔案或資料夾物件的名稱。
FileFilter 過濾器中的accept方法接受一個引數,這個引數就當前檔案或資料夾物件
當我們需要過濾檔名稱時就可以使用FilenameFilter這個過濾器,當我們想對當前檔案或資料夾進行過濾,就可以使用FileFilter ,比如需要當前目錄下的所有資料夾,就可以使用FileFilter 過濾器。
遞迴
遞迴,指在當前方法內呼叫自己的這種現象
遞迴分為兩種,直接遞迴和間接遞迴。
直接遞迴稱為方法自身呼叫自己。間接遞迴可以A方法呼叫B方法,B方法呼叫C方法,C方法呼叫A方法。
遞迴的程式碼演示,計算1-n之間的和,使用遞迴完成
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);
}
}
注意:遞迴一定要有條件限定,保證遞迴能夠停止下來,否則會發生棧記憶體溢位。
在遞迴中雖然有限定條件,但是遞迴次數不能太多。否則也會發生棧記憶體溢位。
總結
- 遞迴: 方法定義中呼叫方法本身的現象
//直接遞迴 public void methodA(){ methodA(); }
//間接遞迴 public void metohdB(){ methodC(); } public void methodC(){ methodB(); }
遞迴注意實現
- 要有出口,否則就是死遞迴
- 次數不能太多,否則就記憶體溢位
File: 檔案和目錄路徑名的抽象表示形式
構造方法:
- public File(String pathname) 通過給定的檔案或資料夾的路徑,來建立對應的File物件
- public File(String parent, String child) 通過給定的父資料夾路徑,與給定的檔名稱或目錄名稱來建立對應的File物件
- public File(File parent, String child)通過給定的File物件的目錄路徑,與給定的資料夾名稱或檔名稱來建立對應的File物件
- 路徑的分類:
絕對路徑, 帶盤碟符
E:\Workspace\day20_File\abc.txt
相對路徑, 不帶碟符
day20_File\abc.txt
- 注意: 當指定一個檔案路徑的時候,如果採用的是相對路徑,預設的目錄為 專案的根目錄
方法
public boolean createNewFile()建立檔案
- 返回值為true, 說明建立檔案成功
- 返回值為false,說明檔案已存在,建立檔案失敗
public boolean mkdir() 建立單層資料夾
- 建立資料夾成功,返回 true
- 建立資料夾失敗,返回 false
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所代表目錄中所有檔案或資料夾的絕對路徑