位元組流
IO流分類和功能:
按照資料流向:輸入和輸出流(讀進來,寫出去)
按照資料類型:位元組流和字元流
底層原理:一切皆為位元組
位元組輸出流的最高抽象父類:
java.io.OutputStream:是位元組輸出流的最高抽象父類
其中,常用的方法:
常用的子類是:java.io.FileOutputStream。
構造方法:
public FileOutputStream(String filename):參數代表檔案的路徑。
public FileOutputStream(File file):參數代表檔案對象。
輸入字元串時需要用get.Bytes()方法
追加資料内容:append
換行
檔案換行:\r\n(這兩個字元)
Linux換行符:\n(這是一個字元)
位元組輸入流的最高抽象父類
java.io.InputStream是位元組輸入流的最高抽象父類。
其中定義的常用方法:
public int read():讀取單個位元組。
public int read(byte[] buf):讀取位元組數組,傳回有效個數。
public void close():關閉流,釋放資源。
常用的子類是:java.io.FileInputStream類。
構造方法:
public FileInputStream(String filename):參數代表檔案路徑。
public FileInputStream(File file):參數代表檔案對象。
使用步驟:
1. 創:建立FileInputStream對象,指定檔案路徑。
2. 讀:調用read方法讀取位元組資料。
3. 關:調用close方法關閉流。
注意事項:
1. 對于寫檔案來說,如果不存在則自動建立;對于讀檔案來說,如果不存在則會發生
FileNotFoundException。
2. 這個read()每次執行都會嘗試讀取下一個,如果沒有下一個則傳回-1值。
每次循環執行了兩次read方法
read讀取位元組的方法還有一個重要的重載形式
read(byte[2])
數組
複制檔案(用位元組)
改換複制檔案方式(用位元組數組)
字元流
- Idea工具檢視檔案與Windows産看的位元組大小不一樣。
因為編碼方式不一樣。
- 字元流底層
也是位元組流,但是還有位元組和字元之間的翻譯功能。參考的是:ASCII/Unicode。
- 字元讀入最高抽象父類reader
java.io.Reader是字元輸入流的最高抽象父類。
-
常用方法
public int read():傳回值代表讀取的【單個字元】。
public int read(char[] buf):讀取一個字元數組,傳回有效個數。
public void close():關閉流。
- 常用子類
java.io.FileReader
- 構造方法
public FileReader(String filename):參數代表檔案路徑名。
public FileReader(File file):參數代表檔案對象。
- 注意事項
字元流應該隻用來處理純文字檔案,凡是能用Windows預設記事本打開并且正确識别的。
- 字元數組outStream
- 字元讀進去最高抽象父類
java.io.Writer是字元輸出流的最高抽象父類,其中定義的方法有:
public void write(int ch):寫單個字元
public void write(char[] buf):寫整個字元數組
public void write(char[] buf, int offset, int length):寫字元數組的一部分。
public void write(String str):寫整個字元串
public void write(String str, int offset, int length):寫字元串的一部分。
public void close():關閉流
- 常用的子類writer
常用的子類是:java.io.FileWriter
構造方法:
public FileWriter(String filename):參數代表檔案路徑名。
public FileWriter(String filename, boolean append):第二個參數代表是否追加。
public FileWriter(File file):參數代表檔案對象。
public FileWriter(File file, boolean append):第二個參數代表是否追加。
輸出流中一個flush方法
- 緩沖區在讀寫資料的過程中有兩個方向
從write –>jvm緩沖區 -> OS ->
從檔案到到資料:
硬碟->-OS -> jvm緩沖區->write
- 使用建議
flush方法:重新整理緩沖區。
close方法:内部也包含一個flush動作,并且關閉流。
使用建議:除非有極強的時效性或者資料穩定性要求,否則盡量避免頻繁調用flush方法。
FileOutputStream裡面沒有緩沖區,是以flush方法根本沒用。
FileInputStream/FileReader/FileWriter底層都有byte[8192]位元組數組作為緩沖區。
後三者當中:
讀資料:一次性讀取8192個位元組,read方法是從中取出一些位元組進行使用。如果緩沖區用完了
空了,再次讀取最多8192個位元組。
寫資料:每次write方法隻是将資料寫到8192位元組數組當中,如果滿了自動刷。
補充:
- a.沒有Java7和Java9的新特性,怎麼能始終執行close方法?
能嵌套try catch和if判斷
b.進一步優化,建立一個CloseUtil工具
- try-with-resource
- 集合Properties工具類
(怎麼打開一張圖)
- Properties中load方法