当我们使用字节输入流时,经常会出现乱码问题,具体原因如下:
核心奥义:
字符流 - 底层揭秘

使用场景

因为我们本次学习的是字符流,所以看一下字符流的体系图

1、FileReader读取数据的方法
细节1:按字节进行读取,遇到中文,一次读多个字节,读取后解码,返回一个整数
细节2:读到文件末尾了,read方法返回-1。
2、代码实战
读取单个中文
package com.hidata.devops.paas.demo;
import java.io.FileReader;
import java.io.IOException;
/**
* @Description :
* @Date: 2023-10-18 10:59
*/
public class TestsDemo {
public static void main(String[] args) throws IOException {
FileReader fir = new FileReader("D:\\devops\\paas\\demo\\d.txt");
int ch;
while ((ch = fir.read()) != -1){
System.out.print((char) ch);
}
fir.close();
}
}
读取多个数据
package com.hidata.devops.paas.demo;
import java.io.FileReader;
import java.io.IOException;
/**
* @Description :
* @Date: 2023-10-18 10:59
*/
public class TestsDemo {
public static void main(String[] args) throws IOException {
FileReader fir = new FileReader("D:\\devops\\paas\\demo\\d.txt");
int ch;
char[] chars = new char[2];
while ((ch = fir.read(chars)) != -1){
System.out.println(new String(chars,0,ch));
}
fir.close();
}
}
1、创建字符输入流对象
底层
2、读取数据
底层
3、代码验证原理
debug代码,看截图

我们发现,一开始就创建了一个缓冲区,长度为8192的字节数组。并且目前缓冲区里面是没有数据的
接下来,我们先往下走一步,

我们发现,第一次读取的时候,他就会把文件里面的所有字节信息都装到缓冲区里面,并且尽可能装满缓冲区。后面再次读取数据的时候,会直接先从缓冲区里面拿,提供效率
4、扩展
文件大小超过缓冲区默认大小(8192)怎么办 ?