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 奮斗成就男人 閱讀(5233) 評論(0)  編輯  收藏


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


          網站導航:
           
          主站蜘蛛池模板: 海阳市| 明光市| 华宁县| 深泽县| 南雄市| 赤城县| 奇台县| 车险| 多伦县| 万州区| 曲周县| 西乌| 高淳县| 黄冈市| 股票| 保亭| 尖扎县| 盈江县| 凤山县| 雷州市| 南乐县| 诸暨市| 宁阳县| 孟州市| 手游| 凉城县| 老河口市| 朝阳县| 嘉峪关市| 福海县| 潢川县| 涿州市| 夏津县| 承德县| 宝山区| 济源市| 茶陵县| 绩溪县| 松阳县| 阜南县| 娄烦县|