先看如下代碼:
public class ConvertTest {
public static void main(String[] args) {
byte[] a = new byte[8];
try {
System.in.read(a);
System.out.write(a);
} catch (IOException e) {
e.printStackTrace();
}
}
}
我工程默認的字符集爲UTF-8,所以每個ASCII字符佔1字節,這裏我們看到,我們通過write把字節數組輸出到控制檯的時候,並不是直接以字節的形式出現的,這意味着不僅僅在read的時候字節輸入流把讀取的字符decode成了字節然後讀入字節數組,同樣在write的時候字節輸出流把寫出字節數組的字節encode成了字符。
轉換流是連通字節流和字符流的橋樑,InputstreamReader是字節流通向字符流的橋樑,它使得原本只能寫入字節到緩衝內存的InputStream類型的System.in可以寫入字符,OutputStreamWriter是字符流通向字節流的橋樑,它使得原本只能從緩衝內存讀出字節的PrintStream類型的System.out可以讀出字符。
但是,無論是InputStream的System.in還是PrintStream的System.out,它們的方法本身並不支持上述操作。
至於那個int,暫時不懂,個人猜想應該有相應的編碼方式。(我要是懂的話就直接解釋源碼了。。)
所以我認爲,InputStreamReader應該是把本來應該寫入的字節轉換成了字符再寫入字符串,OutputStream應該是把字符串裏的字符轉換成本來應該讀出的字節。
其它的等我頭髮變少了的時候再完善吧。。