Java學習日誌(二十一): 緩衝流,轉換流

JavaEE學習日誌持續更新----> 必看!JavaEE學習路線(文章總彙)

緩衝流

原理

在這裏插入圖片描述

字節緩衝輸出流:BufferedOutputStream

java.io.BufferedOutputStream extends OutputStream
BufferedOutputStream:字節緩衝輸出流

繼承自父類OutputStream中的成員方法

  • void write(int b) 寫一個字節
  • void write​(byte[] b) 寫一個字節數組
  • void write​(byte[] b, int off, int len) 寫字節數組的一部分,off數組的開始索引,len寫的字節個數
  • void flush() 刷新此輸出流並強制寫出任何緩衝的輸出字節。
  • void close() 關閉此輸出流並釋放與此流關聯的所有系統資源。

構造方法

  • BufferedOutputStream​(OutputStream out) 創建新的緩衝輸出流以將數據寫入指定的基礎輸出流。

  • BufferedOutputStream​(OutputStream out, int size) 創建新的緩衝輸出流,以使用指定的緩衝區大小將數據寫入指定的基礎輸出流。
    參數

      OutputStream out:字節輸出流,可以傳遞FileOutputStream,BufferedOutputStream就會給FileOutputStream增加一個緩衝區(數組),提高FileOutputStream寫入數據的效率。
    
      int size:指定的緩衝區的大小
    

字節緩衝輸出流的使用步驟

  1. 創建字節緩衝輸出流BufferedOutputStream對象,構造方法中傳遞FileOutputStream對象
  2. 使用BufferedOutputStream對象中的方法write,把數據寫入到內存緩衝區
  3. 使用BufferedOutputStream對象中的方法flush,把內存緩衝區中的數據刷新到文件中
  4. 釋放資源

代碼示例:

public class Demo01 {
    public static void main(String[] args) throws IOException {
        //1. 創建字節緩衝輸出流BufferedOutputStream對象,構造方法中傳遞FileOutputStream對象
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("day10\\bu.txt"));
        //2. 使用BufferedOutputStream對象中的方法write,把數據寫入到內存緩衝區
        bos.write("把數據寫入到緩衝區中".getBytes());
        //3. 使用BufferedOutputStream對象中的方法flush,把內存緩衝區中的數據刷新到文件中
        bos.flush();
        //4. 釋放資源
        bos.close();

    }
}

字節緩衝輸入流:BufferedInputStream

java.io.BufferedInputStream extends InputStream
BufferedInputStream:字節緩衝輸入流

繼承自父類InputStream中的成員方法

  • public void close() :關閉此輸入流並釋放與此流相關聯的任何系統資源。
  • public abstract int read() : 讀取一個字節,並返回
  • public int read(byte[] b) : 讀取多個字節,存儲到數組中返回

構造方法

  • BufferedInputStream​(InputStream in) 創建一個 BufferedInputStream並保存其參數,即輸入流 in ,供以後使用。

  • BufferedInputStream​(InputStream in, int size) 創建具有指定緩衝區大小的 BufferedInputStream ,並保存其參數(輸入流 in )供以後使用。
    參數

      InputStream in:字節輸入流
      int size:指定緩衝區的大小(數組的大小)
    

字節緩衝輸入流的使用步驟:

  1. 創建BufferedInputStream對象,構造方法中傳遞FileInputStream對象
  2. 使用BufferedInputStream對象中的方法read,讀取文件
  3. 釋放資源

代碼示例:

public class Demo02 {
    public static void main(String[] args) throws IOException {
        //1. 創建BufferedInputStream對象,構造方法中傳遞FileInputStream對象
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("day10\\6.txt"));
        //2. 使用BufferedInputStream對象中的方法read,讀取文件
        //public abstract int read() : 讀取一個字節,並返回
//        int len = 0;
//        while ((len = bis.read()) != -1){
//            System.out.println(len);
//        }
        //public int read(byte[] b) : 讀取多個字節,存儲到數組中返回
        byte[] bytes = new byte[1024];
        int len = 0;
        while ((len = bis.read(bytes)) != -1) {
            System.out.println(new String(bytes, 0, len));
        }
        //3. 釋放資源
        bis.close();
    }
}

字符緩衝輸出流:BufferedWriter

java.io.BufferedWriter extends Writer :字符緩衝輸出流
繼承自父類Writer的共性成員方法

  • public abstract void close() :關閉此輸出流並釋放與此流相關聯的任何系統資源。
  • public abstract void flush() :刷新此輸出流並強制任何緩衝的輸出字符被寫出。
  • public void write(int c) :寫出一個字符。
  • public void write(char[] cbuf) :將 b.length字符從指定的字符數組寫出此輸出流。
  • public abstract void write(char[] b, int off, int len) :從指定的字符數組寫出 len字符,從偏移量 off開始輸出到此輸出流。
  • public void write(String str) :寫出一個字符串。
  • public void write​(String str, int off, int len) 寫一個字符串的一部分。

構造方法

  • BufferedWriter​(Writer out) 創建使用默認大小的輸出緩衝區的緩衝字符輸出流。

  • BufferedWriter​(Writer out, int sz) 創建一個使用給定大小的輸出緩衝區的新緩衝字符輸出流。

    參數

      Writer out:字符輸出流,可以傳遞FileWriter,BufferedWriter就會給FileWriter增加一個緩衝區,提高FileWriter寫數據的效率
      int sz:手動指定緩衝區的大小
    

特有的成員方法
void newLine() 寫一個行分隔符。

 System.out.println();//調用的就是newLine()方法;
屏蔽了系統直接的不同,在不同的系統會獲取不同的換行符
windows:\r\n
linux:/n
mac:/r

使用步驟

  1. 創建BufferedWriter對象,構造方法中傳遞FileWriter對象
  2. 使用BufferedWriter對象中的方法write,把數據寫到內存緩衝區中
  3. 釋放資源(會調用flush)

代碼示例:

public class Demo01 {
    public static void main(String[] args) throws IOException {
        //System.out.println();//調用的就是newLine()方法;
        //1.創建BufferedWriter對象,構造方法中傳遞FileWriter對象
        BufferedWriter bw = new BufferedWriter(new FileWriter("day11\\1.txt"));
        //2.使用BufferedWriter對象中的方法write,把數據寫到內存緩衝區中
        for (int i = 0; i < 10; i++) {
            bw.write("你好");
            //bw.write("\r\n");
            bw.newLine();
        }
        //3.釋放資源(會調用flush)
        bw.close();
    }
}

字符緩衝輸入流:BufferedReader

java.io.BufferedReader extends Reader:字符緩衝輸入流

繼承自父類Reader的共性成員方法

  • public void close() :關閉此流並釋放與此流相關聯的任何系統資源。
  • public int read() : 一次讀取一個字符,並返回;讀取到文件結尾返回-1
  • public int read(char[] cbuf) : 一個讀取多個字符,存儲到數組中,返回的是每次讀取的有效字符個數

構造方法:

  • BufferedReader​(Reader in) 創建使用默認大小的輸入緩衝區的緩衝字符輸入流。

  • BufferedReader​(Reader in, int sz) 創建使用指定大小的輸入緩衝區的緩衝字符輸入流。
    參數

     Reader in:字符輸入流
     int sz:指定的緩衝區大小
    

特有的成員方法
String readLine() 讀一行文本。
一行被認爲是由換行符(’\ n’),回車符(’\ r’),回車符後緊跟換行符或到達文件結尾的任何一個終止(EOF)。
返回:包含行內容的字符串,不包括任何行終止字符;如果在未讀取任何字符的情況下到達流末尾,則返回null

使用步驟:

  1. 創建BufferedReader對象,構造方法中傳遞FileReader
  2. 使用BufferedReader對象中的方法read/readline,讀取文件
  3. 釋放資源

代碼示例:

public class Demo02 {
    public static void main(String[] args) throws IOException {
        //1.創建BufferedReader對象,構造方法中傳遞FileReader
        BufferedReader br = new BufferedReader(new FileReader("day11\\1.txt"));
        //2.使用BufferedReader對象中的方法read/readline,讀取文件
        /*
            循環優化,結束條件爲null
         */
        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
        //3.釋放資源
        br.close();
    }
}

文件複製

模擬右鍵複製粘貼: Java文件複製,模擬右鍵複製

文件排序

文件排序案例: Java文件排序(Map集合,字符緩衝流)

轉換流

作用:指定查詢的編碼表

原理

GBK編碼表:1箇中文=2個字節
UTF-8編碼表:1箇中文=3個字節

FileReader:字符輸入流,它有個缺陷,讀取GBK格式的文件會出現亂碼,只能讀取IDE默認編碼格式的文件(UTF-8)
在這裏插入圖片描述

字符轉換輸出流:OutputStreamWriter

java.io.OutputStreamWriter extends Writer:字符轉換輸出流

作用:OutputStreamWriter是從字符流到字節流的橋接器:使用指定的charset將寫入其中的字符編碼爲字節。

繼承自父類Writer的共性成員方法

  • public abstract void close() :關閉此輸出流並釋放與此流相關聯的任何系統資源。
  • public abstract void flush() :刷新此輸出流並強制任何緩衝的輸出字符被寫出。
  • public void write(int c) :寫出一個字符。
  • public void write(char[] cbuf) :將 b.length字符從指定的字符數組寫出此輸出流。
  • public abstract void write(char[] b, int off, int len) :從指定的字符數組寫出 len字符,從偏移量 off開始輸出到此輸出流。
  • public void write(String str) :寫出一個字符串。
  • public void write​(String str, int off, int len) 寫一個字符串的一部分。

構造方法

  • OutputStreamWriter​(OutputStream out) 創建使用默認字符編碼的OutputStreamWriter。

  • OutputStreamWriter​(OutputStream out, String charsetName) 創建使用指定charset的OutputStreamWriter。
    參數

     OutputStream out:字節輸出流,把轉換流轉換之後的字節寫入到文件中
     String charsetName:指定的編碼表名稱,不區分大小寫,GBK/gbk,UTF-8/utf-8/utf8;不寫默認使用IDE編碼UTF-8
    

使用步驟
1. 創建OutputStreamWriter對象,構造方法中綁定字節輸出流對象和指定的編碼表名稱
2. 使用OutputStreamWriter對象中的方法write,把數據寫入到內存緩衝區中(字符->字節
3. 使用OutputStreamWriter對象中的方法flush,把內存緩衝區中的數據刷新到文件中(使用字節流寫字節
4. 釋放資源

代碼示例

  1. 創建一個UTF-8編碼的文件
/*
    使用OutputStreamWriter寫一個UTF-8編碼格式的文件
 */
private static void write_utf8() throws Exception {
    //1. 創建OutputStreamWriter對象,構造方法中綁定字節輸出流對象和指定的編碼表名稱
    OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("day11\\utf8.txt"),"UTF-8");
    //2. 使用OutputStreamWriter對象中的方法write,把數據寫入到內存緩衝區中(字符->字節)
    osw.write("你好");
    //3. 使用OutputStreamWriter對象中的方法flush,把內存緩衝區中的數據刷新到文件中(使用字節流寫字節)
    osw.flush();
    //4. 釋放資源
    osw.close();

}
  1. 創建一個GBK編碼的文件
private static void write_GBK() throws Exception {
    //1. 創建OutputStreamWriter對象,構造方法中綁定字節輸出流對象和指定的編碼表名稱
    OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("day11\\GBK.txt"),"GBK");
    //2. 使用OutputStreamWriter對象中的方法write,把數據寫入到內存緩衝區中(字符->字節)
    osw.write("你好");
    //3. 使用OutputStreamWriter對象中的方法flush,把內存緩衝區中的數據刷新到文件中(使用字節流寫字節)
    osw.flush();
    //4. 釋放資源
    osw.close();
}

字符轉換輸入流:InputStreamReader

java.io.InputStreamReader extends Reader:字符轉換輸入流
作用:InputStreamReader是從字節流到字符流的橋接器:它使用指定的charset讀取字節並將其解碼爲字符。

繼承自父類Reader的共性成員方法

  • public void close() :關閉此流並釋放與此流相關聯的任何系統資源。
  • public int read() : 一次讀取一個字符,並返回;讀取到文件結尾返回-1
  • public int read(char[] cbuf) : 一個讀取多個字符,存儲到數組中,返回的是每次讀取的有效字符個數

構造方法

  • InputStreamReader​(InputStream in) 創建一個使用默認字符集的InputStreamReader。

  • InputStreamReader​(InputStream in, String charsetName) 創建一個使用指定charset的InputStreamReader。
    參數

     InputStream in:字節輸入流,讀取文件中保存的字節
     String charsetName:指定的編碼表名稱,不區分大小寫,GBK/gbk,UTF-8/utf-8/utf8;不寫默認使用IDE編碼UTF-8
    

使用步驟:

  1. 創建InputStreamReader對象,構造方法中綁定字節輸入流和指定的編碼表名稱
  2. 使用InputStreamReader對象中的方法read,讀取文件
  3. 釋放資源

注意
構造方法中指定的編碼表名稱,必須與文件的編碼相同,否則會發生亂碼

代碼示例:

  1. 讀取UTF-8編碼的文件
private static void read_utf8() throws Exception {
    //1.創建InputStreamReader對象,構造方法中綁定字節輸入流和指定的編碼表名稱
    InputStreamReader isr = new InputStreamReader(new FileInputStream("day11\\utf8.txt"),"UTF-8");
    //2.使用InputStreamReader對象中的方法read,讀取文件
    int len = 0;
    while((len = isr.read())!= -1){
        System.out.println((char)len);
    }
    //3.釋放資源
    isr.close();
}
  1. 讀取GBK編碼的文件
private static void read_GBK() throws Exception {
    //1.創建InputStreamReader對象,構造方法中綁定字節輸入流和指定的編碼表名稱
    InputStreamReader isr = new InputStreamReader(new FileInputStream("day11\\GBK.txt"),"GBK");
    //2.使用InputStreamReader對象中的方法read,讀取文件
    int len = 0;
    while((len = isr.read())!= -1){
        System.out.println((char)len);
    }
    //3.釋放資源
    isr.close();
}

轉換文件編碼

需求:將GBK編碼的文本文件,轉化爲UTF-8編碼的文本文件

分析:

  1. 指定GBK編碼的轉換流,讀取文本文件
  2. 使用UTF-8編碼的轉化流,寫出文本文件

什麼時候使用便捷的字符流FileReader和FileWriter:操作文件的編碼固定,就是IDE默認編碼UTF-8
優勢:使用起來簡單,不用傳遞編碼表,不用創建字節流

什麼時候使用轉換字符流InputStreamReader和 OutputStreamWriter:操作文件的編碼不是IDE默認編碼UTF-8

代碼示例:

public class Demo03test {
    public static void main(String[] args) throws Exception {
        //創建字符轉換輸入流InputStreamReader對象
        InputStreamReader isr = new InputStreamReader(new FileInputStream("day11\\GBK編碼文件"),"GBK");
        //創建字符轉換輸出流OutputStreamWriter對象
        //OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("day11\\UTF-8編碼文件"),"UTF-8");
        FileWriter fw = new FileWriter("day11\\UTF-8編碼文件");
        //讀取文件
        char[] chars = new char[1024];
        int len = 0;
        while ((len = isr.read(chars))!=-1){
            //寫
            fw.write(chars,0,len);
        }
        //釋放資源
        fw.close();
        isr.close();
    }
}
發佈了28 篇原創文章 · 獲贊 36 · 訪問量 6121
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章