java中read函数会重复读吗_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进制编辑器打开查看:

7729d9a582d98e08ed5e37941a832b0b.png

c7a99cd707cfa9d758bc633ef80949ae.png

2.Reader类的read()方法读取以UTF-8编码的txt:

1 import java.io.*;2 classa {3 public static void main(String[] s) throwsIOException {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 8868767D 4E00 756A FF0C 8BF4 5F9767975CB1

8FDE 8FDE 70B95934 FF0C 8D24 5A7F 54685BA3 662F 6D2A 798F 4E4B 4EBA FF0C4E5F53EA6709 4ED6 624D 80FD 5A36 9053 8574

3002 000D

可以看到Reader类的read()方法读取的每个char都是UTF-16BE编码保存的。

接下来用InputStream类的read()方法读取UTF-8编码的txt:

1 import java.io.*;2 classb {3 public static void main(String[] s) throwsIOException {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()方法读取

E591 A8 E5 AE A3 E8 87 AA E7 84 B6 E8 A6 81E685 B7 E6 85 A8 E8 A1 A8 E7 99 BD E4 B8 80 E7 95AA EF BC 8C E8 AF B4 E5 BE97 E6 9E 97E5 B2 B1

E8 BF 9E E8 BF 9E E782B9 E5 A4 B4 EF BC 8C E8

B4 A4 E5 A9 BF E591 A8 E5 AE A3 E6 98AF E6 B4

AA E7 A6 8F E4 B9 8B E4 BA BA EF BC 8C E4 B9 9F

E5 8F AA E6 9C89 E4 BB 96 E6 89 8D E8 83BD E5

A8 B6 E981 93 E8 95 B4 E3 80 82 0D

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值