轉換流

 特色數組

 

       |--是字節流和字符流之間的橋樑函數

       |--該流對象能夠對讀取到的字節數據進行指定編碼表的編碼轉換編碼

 

    什麼時候使用spa

 

       |--當字節和字符之間有轉換動做時xml

       |--流操做的數據須要進行編碼表的指定時對象

 

    具體對象體現繼承

 

       |--InputStreamReader:字節到字符的橋樑內存

       |--OutputStreamWriter:字符到字節的橋樑get

 

    說明it

 

       這兩個流對象是字符流體系中的成員,它們有轉換的做用,而自己又是字符流,

 

因此在new的時候須要傳入字節流對象。

 

    構造函數

 

       |--InputStreamReader(InputStream)

 

           經過該構造函數初始化,使用的是系統默認的編碼表GBK。

 

       |--InputStreamReader(InputStream,String charset)

 

           經過該構造函數初始化,能夠經過charset參數指定編碼。

 

       |--OutputStreamWriter(OutputStream)

 

           使用的是系統默認的編碼表GBK。

 

       |--OutputStreamWriter(OutputSream,String charset)

 

           經過該構造函數初始化,能夠經過參數charset指定編碼。

 

    操做文件的字符流對象是轉換流的子類

 

       |--Reader

           |--InputStreamReader(轉換流)

              |--FileReader(文件字符流)

 

       |--Writer

           |--OutputStreamWriter(轉換流)

              |--FileWriter(文件字符流)

 

    說明

 

       轉換流中的read方法,已經融入了編碼表,在底層調用字節流的

 

       read方法時將獲取的一個或者多個字節數據進行臨時存儲,並去

 

       查指定的編碼表,若是編碼沒有指定,則使用默認編碼表。

 

       既然轉換流已經完成了編碼轉換的動做,對於直接操做的文本文

       件的FileReader而言,就不用再從新定義了,只要繼承該轉換

 

       流,獲取其方法,就能夠直接操做文本文件中的字符數據了。

 

    注意

 

       在使用FileReader操做文本數據時,該對象使用的是默認的編碼表,

 

       若是要使用指定的編碼表,必須使用轉換流。

 

    代碼體現

 

       FileReader fr=new FileReader(「test.txt」);

       InputStreamReader isr=new InputStreamReader(new

 

FileInputStreamReader(「test.txt」));

 

這兩句代碼意義相同,操做test.txt中的數據都是使用了系統默認

 

的編碼GBK。由於咱們系統默認使用的編碼表是GBK,若是test.txt中

 

的數據是經過UTF-8形式編碼的,那麼在讀取的時候就須要指定編碼表,

 

所以轉換流必須使用InputStreamReader isr=new

 

InputStreamReader(new FileInputStream(「a.txt」),」UTF-8」);

 

 

 

4、流操做的基本規律

 

|--明確數據源和數據匯(數據目的)

 

實際上是爲了明確是輸入流仍是輸出流

 

|--明確操做的數據是不是純文本數據

 

|--說明

 

數據源

 

     鍵盤System.in、硬盤、File開頭的流對象、內存(數組)。

 

數據匯

 

     控制檯System.out、硬盤、File開頭的流對象、內存(數組)。

 

|--需求

 

將鍵盤錄入的數據存儲到一個文件中和打印到控制檯

 

     |--數據源System.in

 

        既然是源,使用的就是輸入流,可用的體系有InputStream

 

        、Reader。由於鍵盤錄入進來的必定是純文本數據,因此

 

        可使用專門操做字符數據的Reader。而System.in對應

 

        的流是字節讀取流,因此要將其進行轉換,將字節轉換成字

 

符便可,因此要使用Reader體系中的InputStreamReader,

 

若是要提升效率,就使用BufferedReader,代碼如:

 

BufferedReader bur=new BufferedReader(new

 

InputStreamReader(Sysem.in));

 

           |--數據匯:一個文件、硬盤

 

              數據匯必定是輸出流,能夠用的體系有OutputStream、

 

              Writer。往文件中存儲的都是文本數據,那麼可使用字符

 

              流較爲方便Writer。由於操做的是一個文件,因此使用Writer

 

              中的FileWriter,同理,要提升效率就要使用BufferedWriter。

 

              代碼如:BufferedWriter bufr=new BufferedWriter(new

 

FileWriter(「test.txt」));

 

 

清單9,將鍵盤錄入的數據存儲到一個文件中和打印到控制檯代碼   

private static void test7(){ 

    BufferedReader bur=null; 

    OutputStreamWriter osw=null; 

    BufferedWriter bw=null; 

    try{ 

        //數據源 

        bur=new BufferedReader(new InputStreamReader(System.in)); 

        //數據匯 

        osw=new OutputStreamWriter(System.out); 

        //數據匯,由於數據源用的是系統默認編碼,因此這裏能夠直接使用FileWriter 

        //不然必須使用OutputStreamWriter轉換流 

        bw=new BufferedWriter(new FileWriter("D:\\test_target.txt")); 

        String line=null; 

        while((line=bur.readLine())!=null){ 

            osw.write(line); 

            osw.flush();//刷新到控制檯 

            bw.write(line); 

            bw.flush();//刷新到文本文件 

        }    

    }catch(IOException e){ 

        e.toString(); 

    }finally{ 

        try{ 

            if(osw!=null){ 

                osw.close(); 

            } 

            if(bur!=null){ 

                bur.close(); 

            } 

            if(bw!=null){ 

                bw.close(); 

            } 

        }catch(IOException ex){ 

            ex.toString(); 

        } 

    } 

 

 清單9是按照默認編碼表寫入文本文件的,那麼如何按照指定編碼表寫入文件呢?其實也很簡單,將清單9的代碼稍微改一下就能夠了。

 

 

清單10代碼   

private static void test8(){ 

    BufferedReader bur=null; 

    BufferedWriter bw=null; 

    try{ 

        //數據源 

        bur=new BufferedReader(new InputStreamReader(System.in)); 

        //數據匯,按照指定編碼格式存儲到文本文件 

        bw=new BufferedWriter(new OutputStreamWriter(new  

        FileOutputStream("D:\\test_target.txt"),"UTF-8")); 

        String line=null; 

        while((line=bur.readLine())!=null){ 

            bw.write(line); 

            bw.flush();//刷新到文本文件 

        }    

    }catch(IOException e){ 

        e.toString(); 

    }finally{ 

        try{ 

            if(bur!=null){ 

                bur.close(); 

            } 

            if(bw!=null){ 

                bw.close(); 

            } 

        }catch(IOException ex){ 

            ex.toString(); 

        } 

    } 

 

 

既然寫入文件時指定了編碼,那麼在讀取的時候就必須指定該編碼才能正確顯示。

 

 

清單11,讀取指定編碼表的文件代碼   

private static void test9() { 

    BufferedReader bur = null; 

    try { 

        // 注意,這裏讀取的是清單8寫入的文件, 

        // 清單10用UTF-8編碼格式寫入, 

        // 因此在構造InputStreamReader時必須指定UTF-8編碼 

        bur = new BufferedReader(new InputStreamReader( 

new FileInputStream("D:\\test_target.txt"), "UTF-8")); 

        String line = null; 

        while ((line = bur.readLine()) != null) { 

            System.out.println(line); 

        } 

    } catch (IOException e) { 

        e.toString(); 

    } finally { 

        try { 

            if (bur != null) { 

                bur.close(); 

            } 

        } catch (IOException ex) { 

            ex.toString(); 

        } 

    } 

 

 

寫入和讀取都作了,如今還差個複製操做,其實複製文件也很簡單,先讀取文件,再將讀取到的數據寫入文件,不一樣的是,在讀取和寫入時咱們能夠指定編碼表。

 

 

清單12代碼   

private static void test11() { 

    BufferedReader bur = null; 

    BufferedWriter buw = null; 

    try { 

        bur = new BufferedReader(new InputStreamReader( 

new FileInputStream("D:\\test_target.txt"), "UTF-8")); 

        buw = new BufferedWriter(new OutputStreamWriter( 

        new FileOutputStream("D:\\test_target1.txt"),"UTF-8")); 

        String line = null; 

        while ((line = bur.readLine()) != null) { 

            buw.write(line); 

            buw.flush();// 刷新到文本文件 

        } 

    } catch (IOException e) { 

        e.toString(); 

    } finally { 

        try { 

            if (buw != null) { 

                buw.close(); 

            } 

            if (bur != null) { 

                bur.close(); 

            } 

        } catch (IOException ex) { 

            ex.toString(); 

        } 

    } 

相關文章
相關標籤/搜索