From Gossip@Openhome

Java Gossip: InputStreamReader、OutputStreamWriter

若想要對 InputStream、 OutputStream 進行字元處理,您可以使用InputStreamReaderOutputStreamWriter為它們加上字元處理的功能,舉個例子來說,若想要顯示純文字檔案的內容,您不用費心的自行判斷 字元編碼(例如之前範例中要費心的自行判斷是ASCII英文字母或Big5中文字),只要將InputStreamOutputStream的實例作為建構InputStreamReaderOutputStreamWriter時的引數,之後就可以操作InputStreamReaderOutputStreamWriter來進行文字檔案的讀取,讓它們為您作字元判斷與轉換的動作。

下面這個例子可以用來開啟文字檔案,並將其備份為"原檔名.bak":

  • StreamReaderWriterDemo.java
package onlyfun.caterpillar;

import java.io.*;

public class StreamReaderWriterDemo {
public static void main(String[] args) {
try {
FileInputStream fileInputStream =
new FileInputStream(args[0]);
InputStreamReader inputStreamReader =
new InputStreamReader(fileInputStream);
FileOutputStream fileOutputStream =
new FileOutputStream(args[0] + ".bak");
OutputStreamWriter outputStreamWriter =
new OutputStreamWriter(fileOutputStream);

int ch;
// 以字元方式顯示檔案內容
while((ch = inputStreamReader.read()) != -1) {
System.out.print((char)ch);
outputStreamWriter.write(ch);
}
System.out.println();
inputStreamReader.close();
outputStreamWriter.close();
}
catch(ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
}
catch(IOException e) {
e.printStackTrace();
}
}
}

在這邊是使用FileInputStream、FileOutputStream為例,但InputStreamReader、 OutputStreamWriter可以分別以InputStream、OutputStream作為建構物件時的參數。

InputStreamReader、OutputStreamWriter在存取時是以系統的預設字元編碼來進行字元轉換,您也可以自行指定字元編碼,例如
new InputStreamReader(fileInputStream, "GB2312");