InputStreamReader和OutputStreamWriter的用法

首先說明下字節流和字符流:

FileReader,FileWriter 是讀字符的,1個字符是2個字節,16位
OutputStream ,InputStream是讀字節的,1個字節是8位

如果要讀漢字,一個漢字是2個字節,用InputStream讀就把漢字折成兩半,不太適合吧。

字符流主要讀文本效率比較高。
字節流主要讀二進制文件,圖片 ,音頻,視頻等,就是爲了防止出現讀取的單位放大,出現無法還原本程序的目的


如果把文件按字節讀取,然後按照UTF-8的格式編碼顯示,怎麼辦?
InputStreamReader就有這功能,對原字節再編碼的過程。

-----------------------------------------------------------------------------------

下面切入正題:

轉換流:InputStreamReader和OutputStreamWriter

一。InputStreamReader 是字符流Reader的子類,是字節流通向字符流的橋樑。你可以在構造器重指定編碼的方式,如果不指定的話將採用底層操作系統的默認編碼方式,例如 GBK 等

要啓用從字節到字符的有效轉換,可以提前從底層流讀取更多的字節,使其超過滿足當前讀取操作所需的字節。

爲了達到最高效率,可要考慮在 BufferedReader 內包裝 InputStreamReader。例如:

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

二。OutputStreamWriter 是字符流Writer的子類,是字符流通向字節流的橋樑。
每次調用 write() 方法都會導致在給定字符(或字符集)上調用編碼轉換器。在寫入底層輸出流之前,得到的這些字節將在緩衝區中累積

爲了獲得最高效率,可考慮將 OutputStreamWriter 包裝到 BufferedWriter 中,以避免頻繁調用轉換器。例如:

 BufferedWriter out  = new BufferedWriter(new OutputStreamWriter(System.out));

------------------------------------------------------------------------------------------

(1)Reader和Writer類(文本字符流讀寫類):提供的對字符流處理的類,它們爲抽象類。一般通過其子類來實現。
(2)InputStreamReader(InputStream in) 和OutputStreamWriter(OutputStream out):它們可以使用指定的編碼規範並基於字節流生成對應的字符流。

(3)BufferedReader(InputStreamReader isr, int size) 和 BufferedWriter(OutputStreamWriter osr, int size):
爲提高字符流的處理效率,可以採用緩衝機制的流實現對字符流作成批的處理,避免了頻繁的從物理設備中讀取信息 。

示例一:

複製代碼
package com.zlc.io;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class StreamReaderWriterDemo {
 public static void main(String[] args) {
  try { 
   //1.從文本文件中獲得輸入字節到字節輸入流中
   FileInputStream fis = new FileInputStream("f:\\01.txt"); 
   
   //2. 爲FileInputStream加上字符處理功能
   InputStreamReader isr = new InputStreamReader(fis); //將字節流轉換成字符流
   
   //3.爲了達到最高效率,可要考慮在 BufferedReader內包裝 InputStreamReader
   BufferedReader bufr = new BufferedReader(isr);
   
   
   //4.創建將數據寫入到文本文件的文件輸出流
   FileOutputStream fos = new FileOutputStream("f:\\02.txt"); 
   
   //5.爲FileOutputStream加上字符處理功能
   OutputStreamWriter osw = new OutputStreamWriter(fos); 
   
   //6.爲了獲得最高效率,可考慮將 OutputStreamWriter 包裝到 BufferedWriter 中,以避免頻繁調用轉換器
   BufferedWriter bufw = new BufferedWriter(osw);
   
   int ch = 0;
   
   // 以字符方式顯示文件內容 
   while((ch = bufr.read()) != -1) {
    System.out.print((char)ch); 
    osw.write(ch); 
   }
   if(bufr!=null)
    bufr.close();
   if(bufw!=null)
    bufw.close();
  } catch(ArrayIndexOutOfBoundsException e) {
   e.printStackTrace();
  } catch(IOException e) {
   e.printStackTrace();
  } 
 }
}
複製代碼
在通常編碼時,下面的方式更爲常用。下面的代碼是對上面進行了簡化。
示例二:
複製代碼
 package com.zlc.io;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class StreamReaderWriterDemo2 {
 public static void main(String[] args) {
  try { 
   
   BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileInputStream("f:\\01.txt")));
   
   BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("f:\\02.txt")));
   
   int ch = 0;
   
   // 以字符方式顯示文件內容 
   while((ch = bufr.read()) != -1) {
    System.out.print((char)ch); 
    bufw.write(ch); 
   }
   if(bufr!=null)
    bufr.close();
   if(bufw!=null)
    bufw.close();
  } catch(ArrayIndexOutOfBoundsException e) {
   e.printStackTrace();
  } catch(IOException e) {
   e.printStackTrace();
  } 
 }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章