Java開發筆記(八十八)文件字節I/O流

前面介紹瞭如何使用字符流讀寫文件,並指出字符流工具的處理侷限,進而給出隨機文件工具加以改進。隨機文件工具除了支持訪問文件內部的任意位置,更關鍵的一點是經過字節數組讀寫文件數據,採起字節方式比起字符方式有下列兩個好處:
一、文件長度以字節爲單位計量,能夠分配等長的字節數組,卻沒法分配合適長度的字符數組,所以採用字節方式便於從文件中讀取數據。
二、字符流工具主要以字符爲單位處理數據,意味着它適合用來讀寫文本文件,不適用於二進制文件(包括圖片文件、音頻文件、視頻文件等等),而字節方式不存在此類限制。
雖然說隨機文件工具已經實現了以字節方式讀寫文件,但它更適合大文件的任意位置讀寫,假若用於通常文件的處理就顯得大材小用了。畢竟殺雞焉用牛刀,況且牛刀也太笨重了,遠不如普通的刀子靈活。但是字符流工具力有不逮,隨機文件工具又未恰到好處,難不成還有更方便易用的工具嗎?其實文件讀寫能夠抽象爲對某個設備的輸入輸出操做,寫文件至關於向文件輸出數據,讀文件至關於從文件輸入數據。相似的操做還有不少,例如打印文件可看做是向打印機輸出待打印的文本,敲代碼可看做是從鍵盤輸入每一個按鍵對應的字符。Java把這些相關的輸入輸出操做統一爲I/O流,其中字母I表示輸入Input,字母O表示輸出Output。先前介紹的FileReader和FileWriter屬於I/O流中的字符流,而以字節爲單位的則是I/O流中的字節流,字節流自己是個你們族,它有兩個基類,分別是輸入流InputStream和輸出流OutputStream,由這兩個類派生出豐富多樣的輸入輸出流,各自用於不一樣的業務場景。
文件字節流是輸入輸出流當中最多見的一種,它包括文件輸出流FileOutputStream和文件輸入流FileInputStream,其中FileOutputStream用來將數據寫入文件,FileInputStream用來從文件讀取數據,而且兩者都採起字節數組保存信息。文件輸出流的構造方法支持直接填入文件路徑,其對象可調用write方法把字節數組寫入文件,也可調用close方法關閉文件,用起來FileOutputStream像是File與FileWriter的結合體,固然就更加好用。同時無論是輸出流仍是輸入流,它們都實現了AutoCloseable接口,故而支持try-with-resources方式的資源自動釋放。下面是利用文件輸出流FileOutputStream寫文件的代碼例子:html

	private static String mFileName = "D:/test/aae.txt";
	// 利用文件輸出流寫入文件。注意FileOutputStream處理的是字節信息
	private static void writeFile() {
		String str = "白日依山盡,黃河入海流。\n欲窮千里目,更上一層樓。";
		// 根據指定路徑構建文件輸出流對象
		try (FileOutputStream fos = new FileOutputStream(mFileName)) {
			fos.write(str.getBytes()); // 把字節數組寫入文件輸出流
			// 在try(...)裏面建立的輸入輸出流,程序會在處理完成後自動關閉,因此下面的close方法沒必要顯式調用
			//fos.close(); // 關閉文件輸出流
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

 

依此類推,文件輸入流的構造方法一樣支持直接填入文件路徑,也擁有read讀文件方法和close關閉文件方法,像是File與FileReader的結合體。另外FileInputStream有幾個方法值得一提,一個是skip方法,它命令當前位置跳過若干字節,注意該方法跳過的是字節數而非字符數。另外一個是available方法,它返回文件當前位置後面的剩餘部分大小,剛建立文件輸入流對象之時調用available方法,獲得的就是文件大小;若是先調用skip方法再調用available方法,獲得的數值爲文件大小減去跳過的字節數。下面是利用文件輸入流讀文件的代碼例子:數組

	// 利用文件輸入流讀取文件
	private static void readFile() {
		// 根據指定路徑構建文件輸入流對象
		try (FileInputStream fis = new FileInputStream(mFileName)) {
			// 分配長度爲文件大小的字節數組。available方法返回當前位置後面的剩餘部分大小
			byte[] bytes = new byte[fis.available()];
			fis.read(bytes); // 從文件輸入流中讀取字節數組
			String content = new String(bytes); // 把字節數組轉換爲字符串
			System.out.println("content="+content);
			// 在try(...)裏面建立的輸入輸出流,程序會在處理完成後自動關閉,因此下面的close方法沒必要顯式調用
			//fis.close(); // 關閉文件輸入流
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

  

更多Java技術文章參見《Java開發筆記(序)章節目錄工具

相關文章
相關標籤/搜索