Reader、Writer支援Unicode標準字元集(Character set)(位元組串流則只支援ISO-Latin-1 8-bit),在處理串流時,會根據系統預設的字元編碼來進行字元轉換,它們是抽象類別,真正您會使用其子類別,子類別通常會重新定義相關的方法。
在 PushbackInputStream
中,您讀入一個含BIG5中文字及ASCII字元的文字檔案,這邊改寫一下這個例子,使用Reader的子類別
InputStreamReader來轉換讀入的兩個位元組為中文字元,並顯示在螢幕上:
package onlyfun.caterpillar; import java.io.*; public class ReaderDemo { public static void main(String[] args) { try { PushbackInputStream pushbackInputStream = new PushbackInputStream( new FileInputStream(args[0])); byte[] array = new byte[2];
ByteArrayInputStream byteArrayStream = new ByteArrayInputStream(array);
// reader會從已讀的位元陣列中取出資料 InputStreamReader reader = new InputStreamReader(byteArrayStream);
int tmp = 0; int count = 0;
while((count = pushbackInputStream.read(array)) != -1) { // 兩個位元組轉換為整數 tmp = (short)((array[0] << 8) | (array[1] & 0xff)); tmp = tmp & 0xFFFF; // 判斷是否為BIG5,如果是則顯示BIG5中文字 if(tmp >= 0xA440 && tmp < 0xFFFF) { System.out.println("BIG5: " + (char)reader.read()); // 重置ArrayInputStream的讀取游標 // 下次reader才會再重頭讀取資料 byteArrayStream.reset(); } else { // 將第二個位元組推回串流 pushbackInputStream.unread(array, 1, 1); // 顯示ASCII範圍的字元 System.out.println("ASCII: " + (char)array[0]); } } pushbackInputStream.close(); } catch(ArrayIndexOutOfBoundsException e) { System.out.println("請指定檔案名稱"); } catch(IOException e) { e.printStackTrace(); } } }
假設的文字檔案中有以下的文字:"這T是e一s個t測試" ,執行結果會是:
BIG5: 這
ASCII: T
BIG5: 是
ASCII: e
BIG5: 一
ASCII: s
BIG5: 個
ASCII: t
BIG5: 測
BIG5: 試
ASCII: !
EOF
|
InputStreamReader可以用位元組串流中取出位元組資料,並進行字元處理動作,關於Reader、Writer相關子類別,之後會於各相關主題進行介紹。 |
|