天天看點

(三)IO流——緩沖位元組流、緩沖字元流、轉換流

緩沖流也就是對4個基本的FileInputStream、FileOutputStream、FileReader、FileWriter流的增強

相當于在傳輸流檔案時,将資源放入緩沖區數組中

待緩沖區數組滿了,或者調用了flush()方法或close()方法關閉流的話

緩沖區數組才會将内容轉職目标檔案或程式中

通過緩沖區讀寫,減少系統IO次數,進而提高讀寫的效率。

(三)IO流——緩沖位元組流、緩沖字元流、轉換流

位元組緩沖流

public BufferedInputStream(InputStream in)                                           建立一個位元組緩沖輸入流對象

public BufferedOutputStream(OutputStream out)                                  建立一個位元組緩沖輸出流對象

File f1 = new File("c.txt");
File f2 = new File("d.txt");
FileInputStream fis = new FileInputStream(f1);
FileOutputStream fos = new FileOutputStream(f2);
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
           

位元組緩沖流的構造方法,與普通位元組不一樣,傳入的參數是InputStream、OutStream對象

常用FileInputStream、FileOutputStream作參數建立

若想使用位元組緩沖輸出流完成續寫,需建立OutputStream對象時,參數加上true

位元組緩沖流的方法與FileInputStream、FileOutputStream一模一樣

具體參考:https://blog.csdn.net/weixin_42022555/article/details/81774681

僅是在傳輸流檔案過程中,先将檔案放在緩沖區數組中以提高傳輸效率

由于緩沖區位元組流的檔案位元組都是儲存在緩沖區數組中,

是以在需要提前拿到緩沖區數組中的資料時,

需要調用flush()方法将緩沖區數組輸入或輸出到該去的地方

或者在不需要使用該緩沖流對象時可以直接調用close()方法關閉流對象

close()方法也有一個重新整理緩沖區數組的操作并且關閉流

字元緩沖流

public BufferedReader(Reader in)                                                 建立一個字元緩沖輸入流對象

public BufferedWriter(Writer out)                                                  建立一個字元緩沖輸出流對象

File f1 = new File("c.txt");
File f2 = new File("d.txt");
FileReader fr = new FileReader(f1);
FileWriter fw = new FileWriter(f2);
BufferedReader br = new BufferedReader(fr);
BufferedWriter bw = new BufferedWriter(fw);
           

緩沖字元流的構造方法與緩沖位元組流的類似,也是傳入Reader、Writer對象作參數建立對象

若想使用字元緩沖輸出流完成續寫,需在建立Writer對象時,參數加上true

字元緩沖流的方法與Writer、Reader方法一模一樣,可是各自都多了一個特有方法

BufferedReader特有方法:

public  String  readLine ()                                                                          讀取一行文字内容,傳回該行字元串

BufferedReader br = new BufferedReader(new FileReader("c.txt"));
String str = br.readLine();
System.out.println(str);
br.close();
           

BufferedWriter特有方法:

public  void  newLine ()                                                                               輸出一個換行符

BufferedWriter bw = new BufferedWriter(new FileWriter("d.txt"));
bw.newLine();
bw.close();
           

有了BufferedReader的讀取一行文字方法,擷取一整個文本内容的效率就可以比以前一個字元一個字元讀取更快了

BufferedReader br = new BufferedReader(new FileReader("c.txt"));
String str = null;
while ((str = br.readLine())!=null){
    System.out.println(str);
}
br.close();
           

在計算機中存儲的所有資訊其實都是用二進制(01010101)表示的

之是以能在螢幕上看到不一樣的文字數字英文等,是因為二進制通過碼表轉換而成的

編碼:按照某種規則,将字元存儲到計算機中

解碼:将存儲在計算機中的二進制資料按照某種規則解析出來

若編碼和解碼的使用的碼表不相同,則會出現我們常見的亂碼

目前開發工具IDEA預設使用的是UTF-8碼表,而計算機文本預設是以GBK進行編碼

是以使用IDEA開發工具調用IO流檢視,在記事本中編寫好的文本會是亂碼(因為編碼是GBK碼表,解碼是UTF-8)

轉換流:

(三)IO流——緩沖位元組流、緩沖字元流、轉換流

由圖可見,轉換流就是位元組流與字元流之間的橋梁:

在使用OutputStreamWriter轉換流時,是以字元的形式擷取到代碼上的字元輸出對象

可是轉換流會拿着這些字元去找對應的碼表并以二進制的形式輸出到目标檔案中

字元轉換輸出流,繼承Writer類,是字元通向位元組的橋梁

而InputStreamReader轉換流,則是先以位元組輸入的形式取到目标檔案的所有位元組

并拿着這些二進制位元組對應相應的碼表,以字元的形式輸入到java程式中

字元轉換輸入流,繼承Reader類,是位元組通向字元的橋梁

OutputStreamWriter類:

OutputStreamWriter(OutputStream in)                                                         建立使用預設字元集的字元轉換輸出流對象

File f = new File("c.txt");
FileOutputStream fos = new FileOutputStream(f);
OutputStreamWriter osw = new OutputStreamWriter(fos);
           

預設的字元集碼表使用的是UTF-8

OutputStreamWriter(OutputStream in, String charsetName)                  建立指定字元集的字元轉換輸出流對象

File f = new File("c.txt");
FileOutputStream fos = new FileOutputStream(f);
OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
           

位元組輸出流對象作為參數

OutputStreamWriter的使用方法與FileWriter的使用方法一模一樣

InputStreamReader類:

InputStreamReader(InputStream in)                                                   建立使用預設字元集的字元轉換輸入流對象

File f = new File("d.txt");
FileInputStream fis = new FileInputStream(f);
InputStreamReader isr = new InputStreamReader(fis);
           

InputStreamReader(InputStream in, String charsetName)           建立使用指定字元集的字元轉換輸入流對象

File f = new File("d.txt");
FileInputStream fis = new FileInputStream(f);
InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
           

InputStreamReader的使用方法與FileReader的使用方法一模一樣

這樣就不用擔心在計算機記事本上寫好的GBK編碼内容,在開發工具上讀取出來是亂碼

File f = new File("b.txt");
FileInputStream fis = new FileInputStream(f);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
int len = 0;
while ((len = isr.read()) != -1) {
    System.out.println((char) len);
}
isr.close();
           

繼續閱讀