天天看點

Java IO流系列④ -- 轉換流

目錄

  • ​​轉化流概述​​
  • ​​兩個轉換流的介紹​​
  • ​​InputStreamReader​​
  • ​​OutputStreamWriter​​
  • ​​轉化流的應用​​
  • ​​使用InputStreamReader讀取檔案​​
  • ​​使用兩個轉化流完成對文本檔案的轉碼​​

轉化流概述

轉換流是處理流之一

其主要涉及兩類:

  • InputStreamReader:将一個位元組的輸入流轉換為字元的輸入流
  • OutputStreamWriter:将一個字元的輸出流轉換為位元組的輸出流

這兩類從操作資料機關上來說的話都屬于字元流(字元輸入,字元輸出)

作用:提供位元組流與字元流之間的轉換

解碼:位元組、位元組數組 —>字元數組、字元串

編碼:字元數組、字元串 —> 位元組、位元組數組

我們可以說InputStreamReader就是一個解碼的過程,而OutputStreamWriter就是編碼的過程。

使用場景:很多時候我們使用轉換流來處理檔案亂碼問題。實作編碼和

解碼的功能。

(其實我們簡單的認為 字元 = 位元組 + 編碼集, 而字元與位元組不管如何轉化都要使用到編碼集)

兩個轉換流的介紹

InputStreamReader

①實作将位元組的輸入流按指定字元集轉換為字元的輸入流。

②需要和InputStream“套接”。

③構造器:

public InputStreamReader(InputStream in)

省略了後面的參數,也就是說用預設的字元集進行解碼

public InputSreamReader(InputStream in,String charsetName)

使用指定的字元集進行解碼

④例:

Reader isr = new InputStreamReader(System.in,”gbk”);

OutputStreamWriter

①實作将字元的輸出流按指定字元集轉換為位元組的輸出流。

②需要和OutputStream“套接”。

③構造器

public OutputStreamWriter(OutputStream out)

使用預設的字元集進行編碼

public OutputSreamWriter(OutputStream out,String charsetName)

使用指定的字元集進行編碼

轉化流的應用

使用InputStreamReader讀取檔案

使用InputStreamReader去包裹FileInputStream(位元組輸入流)完成文本檔案的讀取

代碼實作:

@Test
    public void test1() throws IOException {

        FileInputStream fis = new FileInputStream("dbcp.txt");
//        InputStreamReader isr = new InputStreamReader(fis);//使用系統預設的字元集
        //參數2指明了字元集,具體使用哪個字元集,取決于檔案dbcp.txt儲存時使用的字元集
        InputStreamReader isr = new InputStreamReader(fis,"UTF-8");//使用系統預設的字元集

        char[] cbuf = new char[20];
        int len;
        while((len = isr.read(cbuf)) != -1){
            String str = new String(cbuf,0,len);
            System.out.print(str);
        }

        isr.close();

    }      

注: 以上代碼省略了使用try-catch進行異常處理。也可以使用File類指定檔案路徑,再将其放入FileInputStream的構造器中。在此轉換流的基礎上我們還可以包裹着一層緩沖流使處理速度更快。

使用兩個轉化流完成對文本檔案的轉碼

例如:

Java IO流系列④ -- 轉換流
@Test
    public void test2() throws Exception {
        //1.造檔案、造流
        File file1 = new File("dbcp.txt");
        File file2 = new File("dbcp_gbk.txt");

        FileInputStream fis = new FileInputStream(file1);
        FileOutputStream fos = new FileOutputStream(file2);

        InputStreamReader isr = new InputStreamReader(fis,"utf-8");
        OutputStreamWriter osw = new OutputStreamWriter(fos,"gbk");

        //2.讀寫過程
        char[] cbuf = new char[20];
        int len;
        while((len = isr.read(cbuf)) != -1){
            osw.write(cbuf,0,len);
        }

        //3.關閉資源
        isr.close();
        osw.close();
    }