Java IO: InputStreamReader和OutputStreamWriter
阿新 • • 發佈:2018-12-22
作者: Jakob Jenkov 譯者: 李璟([email protected])
本章節將簡要介紹InputStreamReader和OutputStreamWriter。細心的讀者可能會發現,在之前的文章中,IO中的類要麼以Stream結尾,要麼以Reader或者Writer結尾,那這兩個同時以位元組流和字元流的類名字尾結尾的類是什麼用途呢?簡單來說,這兩個類把位元組流轉換成字元流,中間做了資料的轉換,類似介面卡模式的思想。
InputStreamReader
InputStreamReader會包含一個InputStream,從而可以將該輸入位元組流轉換成字元流,程式碼例子:
InputStream inputStream = new FileInputStream("c:\\data\\input.txt"); Reader reader = new InputStreamReader(inputStream); int data = reader.read(); while(data != -1){ char theChar = (char) data; data = reader.read(); } reader.close();
注意:為了清晰,程式碼忽略了一些必要的異常處理。想了解更多異常處理的資訊,請參考Java IO異常處理。
read()方法返回一個包含了讀取到的字元內容的int型別變數(譯者注:0~65535)。程式碼如下:
int data = reader.read();
你可以把返回的int值轉換成char變數,就像這樣:
char aChar = (char) data; //譯者注:這裡不會造成資料丟失,因為返回的int型別變數data只有低16位有資料,高16位沒有資料
如果方法返回-1,表明Reader中已經沒有剩餘可讀取字元,此時可以關閉Reader。-1是一個int型別,不是byte或者char型別,這是不一樣的。
InputStreamReader同樣擁有其他可選的建構函式,能夠讓你指定將底層位元組流解釋成何種編碼的字元流。例子如下:
InputStream inputStream = new FileInputStream("c:\\data\\input.txt"); Reader reader = new InputStreamReader(inputStream, "UTF-8");
注意建構函式的第二個引數,此時該InputStreamReader會將輸入的位元組流轉換成UTF8字元流。
OutputStreamWriter
OutputStreamWriter會包含一個OutputStream,從而可以將該輸出位元組流轉換成字元流,程式碼如下:
OutputStream outputStream = new FileOutputStream("c:\\data\\output.txt"); Writer writer = new OutputStreamWriter(outputStream); writer.write("Hello World"); writer.close();
OutputStreamWriter同樣擁有將輸出位元組流轉換成指定編碼的字元流的建構函式。