InputStream類的read()方法是從流裏面取出一個字節,他的函數原型是 int read(); ,Reader類的read()方法則是從流裏面取出一個字符(一個char),他的函數原型也是 int read(); 。java
咱們都知道java使用的是UNICODE字符集,在java中字符和字符串都是使用UTF-16BE編碼方式,即一個字符兩個字節,在內存中高位在低字節,這也是BE的由來,BIG ENDIAN能夠理解成大位的在開頭,例如一個char的值是0XAC56,那麼在內存中的形式就是AC 56,假設0XAC的內存地址爲1,那麼0X56的內存地址是2。小程序
接下來再分析一下Reader與InputStream兩個類中的read()都分別幹了什麼,InputStream類的read()方法只是簡單的從輸入流裏面取出一個字節,而後返回他的值,Reader類的read()方法則是先判斷出輸入流使用的是何種編碼方式(實際上若是咱們不指定編碼,則直接使用系統的默認編碼做爲輸入流的編碼,在中文Windows系統中默認爲GB2312),而後用輸入流的編碼方式解碼出一個字符(輸入流的編碼方式肯定了也就肯定了讀取一個字符須要取出個字節),取出一個字符後再把這個字符用UTF-16BE編碼並返回編碼值,這就是read()方法返回的值。編輯器
下面寫一個小程序就能夠證實上面的結論:函數
1.首先將同一個句話 周宣天然要慷慨表白一番,說得林岱連連點頭,賢婿周宣是洪福之人,也只有他才能娶道蘊。 分別以UTF-8和UTF-16BE兩種方式保存,用16進制編輯器打開查看:測試
2.Reader類的read()方法讀取以UTF-8編碼的txt:編碼
1 import java.io.*; 2 class a { 3 public static void main(String[] s) throws IOException { 4 5 System.out.println("Reader類的read()方法讀取"); 6 FileInputStream fis = new FileInputStream("測試.txt"); 7 InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); 8 //System.out.println(isr.getEncoding()); 9 int ch = 0; 10 int[] temp = new int[1024]; 11 int i = 0; 12 13 while ((ch = isr.read()) != -1) { 14 temp[i++] = ch; 15 System.out.print((char) ch); 16 } 17 System.out.print("\n\n"); 18 19 System.out.println("每一個字符的編碼值:"); 20 for (int j = 0; j < i; j++) { 21 if (j % 8 == 0 && j != 0) { 22 System.out.print("\n"); 23 } 24 System.out.printf("%04X ", temp[j]); 25 26 } 27 28 } 29 }
輸出結果以下:spa
Reader類的read()方法讀取 周宣天然要慷慨表白一番,說得林岱連連點頭,賢婿周宣是洪福之人,也只有他才能娶道蘊。 每一個字符的編碼值: 5468 5BA3 81EA 7136 8981 6177 6168 8868 767D 4E00 756A FF0C 8BF4 5F97 6797 5CB1 8FDE 8FDE 70B9 5934 FF0C 8D24 5A7F 5468 5BA3 662F 6D2A 798F 4E4B 4EBA FF0C 4E5F 53EA 6709 4ED6 624D 80FD 5A36 9053 8574 3002 000D
能夠看到Reader類的read()方法讀取的每一個char都是UTF-16BE編碼保存的。code
接下來用InputStream類的read()方法讀取UTF-8編碼的txt:blog
1 import java.io.*; 2 class b { 3 public static void main(String[] s) throws IOException { 4 System.out.println("InputStream類的read()方法讀取"); 5 int ch0 = 0, x = 0; 6 FileInputStream fis = new FileInputStream("測試.txt"); 7 while ((ch0 = fis.read()) != -1) { 8 if (x++ % 16 == 0 && x != 0) { 9 System.out.print("\n"); 10 } 11 System.out.printf("%02X ", ch0); 12 } 13 System.out.print("\n\n"); 14 } 15 }
輸出結果以下:內存
InputStream類的read()方法讀取 E5 91 A8 E5 AE A3 E8 87 AA E7 84 B6 E8 A6 81 E6 85 B7 E6 85 A8 E8 A1 A8 E7 99 BD E4 B8 80 E7 95 AA EF BC 8C E8 AF B4 E5 BE 97 E6 9E 97 E5 B2 B1 E8 BF 9E E8 BF 9E E7 82 B9 E5 A4 B4 EF BC 8C E8 B4 A4 E5 A9 BF E5 91 A8 E5 AE A3 E6 98 AF E6 B4 AA E7 A6 8F E4 B9 8B E4 BA BA EF BC 8C E4 B9 9F E5 8F AA E6 9C 89 E4 BB 96 E6 89 8D E8 83 BD E5 A8 B6 E9 81 93 E8 95 B4 E3 80 82 0D