290 为什么出现字节流
> 1个汉字,GBK编码下占用2字节,UTF-8编码下占用3字节。故如果挨个输出文件中的汉字,则显示为乱码。所以字节流不能读中文
【需求】
用字节流读数据
【准备】
"myCharStream\\src\\e290\\ninty.txt"
--------------------------------------------------------------
1 package e290;
3 import java.io.FileInputStream;
4 import java.io.IOException;
5 import java.util.Arrays;6
7 public class OriginalEdition {
8 public static void main(String[] args) throws IOException {
9 FileInputStream fis = new FileInputStream("myCharStream\\src\\e290\\ninty.txt");
10 int by;
11 while ((by = fis.read()) != -1) {
12 System.out.println((char) by);
13 }
14 String s1 = "abc";
15 byte[] b1 = s1.getBytes();
16 System.out.print(Arrays.toString(b1)); //[97, 98, 99]
17
18 String s2 = "中国";
19 byte[] b2 = s2.getBytes();
20 System.out.print(Arrays.toString(b2)); //[-28, -72, -83, -27, -101, -67]
21
22 String s3 = "中国";
23 byte[] b3 = s3.getBytes("UTF-8");
24 System.out.print(Arrays.toString(b3)); //[-28, -72, -83, -27, -101, -67]
25
26 String s4 = "中国";
27 byte[] b4 = s4.getBytes("GBK");
28 System.out.print(Arrays.toString(b4)); //[-42, -48, -71, -6]
29
30 fis.close();
31 }
32 }
33 /*
34 我们在前面用字节流复制过文本文件,当时用的文件里面也有中文内容,但是没有问题,为什么?
35 ——因为用字节流复制文件时,读一个字节,写一个字节,最终会根据字节拼成一个汉字。
36 系统怎么知道字节是汉字还是字母还是别的呢?
37 测试一下,找到答案,第1轮测试
38 String s="abc";//[97, 98, 99]
39 byte[] b=s.getBytes();
40 System.out.print(Arrays.toString(b));
41 输出了[97, 98, 99],一个数字对应一个字母。
42 第2轮测试,把字符串改成汉字
43 String s="中国";[-28, -72, -83, -27, -101, -67]
44 byte[] b=s.getBytes();
45 System.out.print(Arrays.toString(b));
46 输出了[-28, -72, -83, -27, -101, -67],这是UTF-8编码的
47 第3轮测试,在getBytes方法的参数里指定编码为UTF-8
48 运行完毕,写屏[-28, -72, -83, -27, -101, -67],和刚才默认的编码的写屏一样
49 第4轮测试,在getBytes方法的参数里指定编码为GBK
50 输出[-42, -48, -71, -6],由此可知在GBK编码下,1个汉字占2个字节
51 【小结】
52 - 论采用哪种编码,汉字在存储时,第一个数字一定是负数。
53 - UTF-8编码下,3个字节拼成1个汉字后输出
54 - GBK编码下,2个字节拼成1个汉字后输出
55 【总结】
56 犹豫字节流操作中文不便,Java提供字符流。
57 字符流 = 字节流 + 编码表
58 */