1 字節緩衝流:也叫做高效流
緩衝流:內部會再提供一個byte[]數組作爲緩衝區,提高讀寫效率。但是緩衝流自身沒有讀寫能力,需要我們在構造方法中傳遞一個對應的基礎流。
實現思路:
1、創建緩衝流對象
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(文件路徑));
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(文件路徑));
2、調用read()或者write()的方法
3、釋放資源
2、字符流
編碼和解碼問題:
編碼:將看的懂的轉換成看不懂就是編碼。
解碼:將看不懂的轉換成看的懂就是解碼。
編碼表:編碼和解碼都必須依賴一個碼錶,這個碼錶就是編碼表。
常見的碼錶:
ASCII:一個字符佔一個字節,不支持中文
iso-8859-1:拉丁碼錶,歐洲使用。一個字符佔一個字節,不支持中文
gbk/gb2132:國標碼,一個字符佔2個字節,支持中文。
utf-8:萬國碼表,國際通用,一箇中文佔3個字節。(常用)
轉換流:需要轉碼或者轉換流對象的時候用到。(用的很少)
InputStreamReader:自身是字符流,是從字節流到字符流的橋樑:它讀取字節,並使用指定的charset將其解碼爲字符
讀的過程:文件--->構造方法中的InputStream讀文件(讀字節)--->InputStreamReader--->字符 解碼的過程
OutputStreamWriter:自身是字符流,是從字符流到字節流的橋樑:使用指定的charset將寫入的字符編碼爲字節
寫的過程:程序(字符)--->OutputStreamWriter--->構造方法中的OutputStream寫數據(寫字節)--->文件 編碼的過程
說明:下面的字符輸出流FileWriter和字符輸入流FileReader底層就是使用OutputStreamWriter和InputStreamReader
字符輸出流:(重點*****)
FileWriter extends OutputStreamWriter
構造方法:
FileWriter(String fileName) :根據一個字符串類型的文件路徑創建一個字符輸出流對象
FileWriter(String fileName, boolean append):根據一個字符串類型的文件路徑創建一個字符輸出流對象,參數2append表示是否追加
字符輸入流:(重點*****)
FileReader extends InputStreamReader
構造方法:
FileReader(String fileName):根據一個字符串類型的文件路徑創建一個字符輸入流對象
說明:FileReader和FileWriter底層都是使用默認的字符集編碼。
字符緩衝輸出流:
BufferedWriter字符緩衝輸出流
構造方法:
BufferedWriter(Writer out) :創建一個字符串緩衝輸出流對象,傳遞對應的基礎的字符輸出流,使用默認的緩衝區大小
BufferedWriter(Writer out, int sz):創建一個字符串緩衝輸出流對象,傳遞對應的基礎的字符輸出流,參數2指定緩衝區大小
成員方法:
void close() :關閉流,先刷新。
void flush() :刷新流。
void newLine():寫一行行分隔符。
void write(String str) :一次寫一個字符串,是繼承父類Writer的方法
BufferedReader:字符緩衝輸入流對象
構造方法:
BufferedReader(Reader in):創建一個字符串緩衝輸入流對象,傳遞對應的基礎的字符輸入流,使用默認的緩衝區大小
BufferedReader(Reader in, int sz):創建一個字符串緩衝輸入流對象,傳遞對應的基礎的字符輸入流,參數2指定緩衝區大小
成員方法:
void close():關閉流並釋放與之相關聯的任何系統資源。
String readLine():讀一行文字。特有的方法
3、案例
4、IO流總結
輸入流:
字節輸入流:FileInputStream--->BufferedInputStream(緩衝流,自身沒有讀寫功能)
字符輸入流:FileReader--->BufferedReader(緩衝流,自身沒有讀寫功能)
輸出流:
字節輸出流:FileOutputStream--->BufferedOutputStream(緩衝流,自身沒有讀寫功能)
字符輸出流:FileWriter--->BufferedWriter(緩衝流,自身沒有讀寫功能)
如何選擇流對象:
如果是讀寫文本文件,那麼首先考慮的是基礎的字符流。如果是讀寫非文本文件,那麼首先考慮的是基礎的字節流。
如果想高效,那麼就選擇對應的緩衝流對象。如果想手動指定字符集,那麼選擇轉換流。