<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    yxhxj2006

    常用鏈接

    統計

    最新評論

    字節流與字符流轉換

    字節流與字符流之間的區別卻可以聯系起來,這就是表中的兩個類InputStreamReader和OutputStreamWriter。InputStreamReader負責把字節輸入流轉換為字符輸入流,OutputStreamWriter負責把輸出字節流轉換為輸出字符流。下面來看看如何進行轉換。

    1.字節輸入流轉換為字符輸入流

    InputStreamReader是字節流通向字符流的橋梁,它使用指定的charset讀取字節并將其解碼為字符。它擁有一個InputStream類型的變量,并繼承了Reader,使用了對象的適配器模式,如圖12-9所示。

      

    根據InputStream的實例創建InputStreamReader的方法有4種:

    1. InputStreamReader(InputStream in);                
    2. //根據默認字符集創建  
    3. InputStreamReader(InputStream in, Charset cs);        
    4. //使用給定字符集創建  
    5. InputStreamReader(InputStream in, CharsetDecoder dec);    
    6. //使用給定字符集解碼器創建  
    7. InputStreamReader(InputStream in, String charsetName);    
    8. //使用指定字符集創建 

    后面的3個構造函數都指定了一個字符集,最后一個是最簡單的,可以直接指定字符集的名稱來創建,例如GB2312等。

    每次調用InputStreamReader中的一個read()方法都會導致從底層輸入流讀取一個或多個字節。要啟用從字節到字符的有效轉換,可以提前從底層流讀取更多的字節,使其超過滿足當前讀取操作所需的字節。共有3個可用的read()方法:

    1. int read();                               
    2. //讀取單個字符  
    3. int read(char[] cbuf, int offset, int length);            
    4. //將字符讀入數組中的某一部分  
    5. boolean ready();                              
    6. //判斷此流是否已經準備好用于讀取 

    InputStreamReader繼承自Reader,因此該類的實例可以被各種輸入字符流包裝。為了達到最高效率,可以考慮在BufferedReader內包裝InputStreamReader。例如程序12-20所示,我們首先創建了一個FileInputStream類的實例,然后轉換為InputStreamReader對象is,最后使用BufferedReader進行包裝。這樣就可以將字節流轉換為帶緩沖功能的字符流。

    程序12-20  TestInputStreamReader.java

    1. public class TestInputStreamReader {  
    2.     public static void main(String[] args) {  
    3.         try {  
    4. // 創建輸入流  
    5. FileInputStream fis = new FileInputStream("D:/demo/test.txt");  
    6. InputStreamReader is = new InputStreamReader(fis);  
    7. BufferedReader bis = new BufferedReader(is);  
    8.  
    9. // 從輸入流讀取數據  
    10. while (bis.ready()) {  
    11.     int c = bis.read();  
    12.     System.out.print((char)c);  
    13. }  
    14.  
    15. // 關閉輸入流  
    16. bis.close();  
    17. is.close();  
    18. fis.close();  
    19.         } catch (IOException e) {  
    20.         }  
    21.     }  

    2.字節輸出流轉換為字符輸出流

    OutputStreamWriter是字符流通向字節流的橋梁,可使用指定的charset將要寫入流中的字符編碼成字節。因此,它擁有一個OutputStream類型的變量,并繼承了Writer,使用了對象的適配器模式,如圖12-10所示。

       

    根據OutputStream的實例創建OutputStreamWriter的方法有4種:

    1. OutputStreamReader(OutputStream out);                     
    2. //根據默認字符集創建  
    3. OutputStreamReader(OutputStream out, Charset cs);                 
    4. //使用給定字符集創建  
    5. OutputStreamReader(OutputStream out, CharsetDecoder dec);         
    6. //使用給定字符集解碼器創建  
    7. OutputStreamReader(OutputStream out, Stroutg charsetName);        
    8. //使用指定字符集創建 

    后面的3個構造函數都制定了一個字符集,最后一個是最簡單的,可以直接指定字符集的名稱來創建,例如GB2312等。

    每次調用write()方法都會導致在給定字符(或字符集)上調用編碼轉換器。在寫入底層輸出流之前,得到的這些字節將在緩沖區中累積。可以指定此緩沖區的大小,不過,默認的緩沖區對多數用途來說已足夠大。注意,傳遞給write()方法的字符沒有緩沖。共有3個可用的write()方法:

    1. void write(char[] cbuf, int off, int len);//寫入字符數組的某一部分  
    2. void write(int c);//寫入單個字符  
    3. void write(String str, int off, int len);//寫入字符串的某一部分 

    OutputStreamWriter繼承自Writer,因此該類的實例可以被各種輸出字符流包裝。為了達到最高效率,可以考慮在BufferedWriter內包裝OutputStreamWriter。例如程序12-21所示,我們首先創建了一個FileOutputStream類的實例,然后轉換為OutputStreamReader對象os,最后使用BufferedWriter進行包裝。這樣就可以將字節流轉換為帶緩沖功能的字符流。

    程序12-21  TestOutputStreamWriter.java

    1. public class TestOutputStreamWriter {  
    2. public static void main(String[] args) {  
    3. try {  
    4. // 創建輸出流  
    5. FileOutputStream fos = new FileOutputStream("D:/demo/test.txt");  
    6. OutputStreamWriter os = new OutputStreamWriter(fos);  
    7. BufferedWriter bos = new BufferedWriter(os);  
    8.  
    9. // 寫入數組數據  
    10. char[] buf = new char[3];  
    11. buf[0] = 'a';  
    12. buf[1] = 'b';  
    13. buf[2] = '中';  
    14. bos.write(buf);  
    15.  
    16. // 關閉輸出流  
    17. bos.close();  
    18. os.close();  
    19. fos.close();  
    20. catch (IOException e) {  
    21. }  
    22. }  

    posted on 2013-08-08 22:08 奮斗成就男人 閱讀(5235) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 国产一区二区三区免费观在线| 亚洲AV日韩精品久久久久久| 五月天国产成人AV免费观看| 久久亚洲免费视频| 国产精品永久免费10000| 亚洲一久久久久久久久| 在线亚洲精品自拍| 18禁美女黄网站色大片免费观看| 亚洲性色精品一区二区在线| 亚洲人成网站观看在线播放| 午夜视频免费在线观看| 亚洲AV无码一区二区三区电影 | 国产免费久久精品99久久| 亚洲精品熟女国产| 亚洲精品成人网久久久久久| 2020因为爱你带字幕免费观看全集 | 精品国产日韩亚洲一区91| 亚洲国产精品高清久久久| 在线a毛片免费视频观看| 久久中文字幕免费视频| 偷自拍亚洲视频在线观看99| 亚洲成人午夜电影| 亚洲综合伊人久久综合| 四虎www免费人成| 在线免费中文字幕| 国产精品美女久久久免费| 亚洲色偷偷色噜噜狠狠99| 亚洲欧洲一区二区| 国产成人综合亚洲AV第一页| 免费看的成人yellow视频| 日韩人妻一区二区三区免费| 一级做a爰全过程免费视频毛片| 亚洲一区二区三区国产精品无码| 亚洲欧洲无码AV电影在线观看| 在线日韩av永久免费观看| 色老头永久免费网站| 免费观看91视频| 一边摸一边爽一边叫床免费视频| 亚洲精品第一综合99久久| 亚洲香蕉免费有线视频| 亚洲不卡中文字幕无码|