1. 程式人生 > >java 轉換流InputStreamReader和OutputStreamWriter

java 轉換流InputStreamReader和OutputStreamWriter

轉換流InputStreamReader和OutputStreamWriter,看結尾的字母,知道它們是屬於字元流的

先說不管字元還是位元組,儲存在電腦上或者傳輸在網路中的只能是位元組,為什麼要有字元呢,我理解的是每個國家語言都不同,那麼所用的字元也是不同的,每種字元都可以通過某種規則,即編碼和解碼都遵循同樣的規則才能將文字資訊正常顯示,如果編碼和解碼使用不同的規則,就會出現亂碼的情.,就好像以前的電報,發報的對照著編碼手冊將自己想說的話編碼成訊號發出去,收聽電報的收到訊號後,對照著編碼手冊將訊號轉換成自己能理解的漢字,如果這兩本手冊不一樣,那傳出去和收回來的意思會大不同.計算機也面臨這樣的問題,所以有了編碼方式

ASCII編碼,主要是用來顯示英文,gb2312以前用來顯示漢字,但沒收錄一些繁體字,所以改進成gbk,big5是香港臺灣那邊的編碼方式,我猜的

本節內容:

目錄

InputStreamReader

OutputStreamWriter 


 

轉換流的作用是以字元流的操作方式來操作位元組流物件,以字元流的方式將檔案讀到記憶體,再按字元流的方式從記憶體中寫入打檔案

InputStreamReader

InputStreamReader是將輸入的位元組流變成字元流,其構造方法的部分原始碼:


public class InputStreamReader extends Reader {  
    public InputStreamReader(InputStream in) {
//這個構造方法使用預設的編碼形式
        super(in);
        try {
            sd = StreamDecoder.forInputStreamReader(in, this, (String)null); // ## check lock object
        } catch (UnsupportedEncodingException e) {
            // The default encoding should always be available
            throw new Error(e);
        }
    }
    public InputStreamReader(InputStream in, String charsetName)
//使用指定的編碼形式
        throws UnsupportedEncodingException
    {
        super(in);
        if (charsetName == null)
            throw new NullPointerException("charsetName");
        sd = StreamDecoder.forInputStreamReader(in, this, charsetName);
    }
    
   

第二個構造方法中需要兩個引數,一個InputStream物件,一個該物件的編碼形式.

然後就可以以字元的輸入流物件操作這個位元組的輸入流物件了.

 

OutputStreamWriter 

  Writer的子類,將輸出的字元流變成位元組流,字元流的輸入物件變成位元組流輸入物件

看下構造方法的部分原始碼:

public class OutputStreamWriter extends Writer {
    private final StreamEncoder se;
    public OutputStreamWriter(OutputStream out, String charsetName)
//位元組輸出流物件和指定的編碼形式
        throws UnsupportedEncodingException
    {
        super(out);
        if (charsetName == null)
            throw new NullPointerException("charsetName");
        se = StreamEncoder.forOutputStreamWriter(out, this, charsetName);
    }
    public OutputStreamWriter(OutputStream out) {
//位元組輸出流物件,使用預設的編碼形式
        super(out);
        try {
            se = StreamEncoder.forOutputStreamWriter(out, this, (String)null);
        } catch (UnsupportedEncodingException e) {
            throw new Error(e);
        }
    }
...
}

第一個構造方法需要使用OutputStream物件和該物件的編碼形式,然後就可以以輸出字元流的形式操作這個輸出位元組流了

示例:

將utf-8編碼的文字檔案1.txt的內容,通過轉換流寫入到gbk編碼的2.txt中

原始檔utf-8編碼的1.txt內容:
你好,我們要加油!


//////////////////////////////////////////////////////////////////////

public class Test01 {
    public static void main(String[] args){
        try (
                InputStreamReader isr=new InputStreamReader(new FileInputStream("1.txt"),"utf-8") ;
                OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("2.txt"),"gbk");
        ){
            int temp;
            char [] charArr=new char[3];
            while((temp=isr.read(charArr))!=-1){
                osw.write(charArr,0,temp);
            }

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    }
out:
目標檔案gbk編碼的2.txt的檔案內容為:
你好,我們要加油!