1. 程式人生 > >java----day22(IO流)

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();
}

 

遞迴注意實現

  1. 要有出口,否則就是死遞迴
  2. 次數不能太多,否則就記憶體溢位

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所代表目錄中所有檔案或資料夾的絕對路徑