1.字节流读取
首先我们先创建一个文本文档,在里面输入一行中文:
接下来在代码中创建字节输入流读取文本文档中的内容,该文档用UTF-8的编码形式保存的:
File file = new File("D:\\桌面\\IDEA实验室\\读取.txt");
FileInputStream fis = new FileInputStream(file);
byte[] a = new byte[(int)file.length()];
try {
fis.read(a);
fis.close();
我们都知道Java肯定是不能把中文之间存储到内存当中的,计算机也看不懂中文,由于文档保存形式是UTF-8,所以读取时一个中文字就会被编码成三个字节,全读取到字节数组中就有18个字节,遍历一下将这些数组元素输出,得到的结果如下:
共18个数字,每个数字都相当于是一个字节。
(tips:字节的取值范围是-128到127,我们用字节流读取的中文都以字节形式存储在字节数组中)
最后如果想要输出文档中的汉字的话,我们把字节数组以UTF-8编码方式去解码,我们就可以通过这些数字的到相应的汉字,我们通过创建一个字符串对象接收字节数组和编码方式,再直接输出该变量名。
(tips:如果你的编译器默认的编码方式就是UTF-8,可以不用指定编码方式,只接收数组这一参数即可,如String s = new String(a);
我们可以通过输出Charset.defaultCharset()看默认编码方式。
String s = new String(a,"UTF-8");
System.out.println(s);
输出结果:
2.字符流读取
创建一个字符流,访问的是上面内容的同一个文档:
FileReader fr = new FileReader(file);
char[] a = new char[(int) file.length()];
try {
fr.read(a);
fr.close();
这里创建的是字符数组去接收这些读取过来的中文字符,然后同样的创建字符串对象接收字符数组a,最后输出字符串变量名:
String s = new String(a);
System.out.println(s);
输出结果:
字符流FileReader是不能手动设置编码方式的,这里能输出是因为文档是以UTF-8的编码方式保存的,编译器也是默认UTF-8的编码方式,当文档为别的编码方式(如GBK) 保存时,编译时要更改编译器的编码方式,要使用另一种字符流InputStreamReader来代替,如下
InputStreamReader isr = new InputStreamReader(new FileInputStream(file),Charset.forName("GBK"))
tips:字符流读取文档到字符数组中,如果我们用(int) file.length()来确定数组长度,六个汉字就占18个字节,所以数组长度确定为了18,而存储这六个汉字只需要数组长度为6就可以了,多出来的12在输出时会显示null。
再加一点:文件的编码保存形式在另存为中可以更改