Reader與InputStream兩個類中的read()的區別


InputStream類的read()方法是從流里面取出一個字節,他的函數原型是 int read(); ,Reader類的read()方法則是從流里面取出一個字符(一個char),他的函數原型也是 int read(); 。

我們都知道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 }

輸出結果如下:

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編碼保存的。

接下來用InputStream類的read()方法讀取UTF-8編碼的txt:

 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM