因为我们再使用字节流读取文件的内容的时候,一次只能读取一个字节,但是如果内容是中文的话,可能会产生乱码的情况
如下所示:
已知a.txt文本文档中的内容为:你好啊
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("d:\\a.txt");
int len = 0;
while ((len = fis.read()) != -1){
System.out.println((char)len);
}
fis.close();
}
得到的结果为:
原因:
因为我们再读取的时候一个字节一个字节的读取,但是在编码UTF-8下一个字符占3个字节(utf-8编码下中文字符少数占4个字节,大多数中文字符占3个字节,gbk编码下常用中文字符占2个字节,该编码默认为两个字节的长度),原本一个汉字是三个字节,但是在第五行的时候我们仅仅对一个汉字的三分之一字节进行转换为char类型的话,就会出现乱码的情况
由此我们引入了字符流
java.io.Reader
是字符串输入流,是字符串输入流中最顶层的父类,定义了一些共性的成员方法,同时他也是一个抽象类
Reader中的共性方法(不是全部)
int read()
读取单个字符int read(char[] cbuf)
将字符读入数组abstract void close()
关闭该流并释放与之关联的所有资源。
由于字符流是一个抽象类,所以我们通过他的孙子类FileReader类来学习它
FileReader类是文件字符输入流
作用:把硬盘文件中的数据以字符的方式读取到内存当中
FileReader类中的构造方法
FileReader(File file)
在给定从中读取数据的 File 的情况下创建一个新 FileReaderFileReader(String fileName)
在给定从中读取数据的文件名的情况下创建一个新 FileReader
字符输入流的使用步骤:
1、创建FileReader对象,构造方法中绑定要读取的数据源
2、使用FileReader对象中的read方法读取文件的内容
3、释放资源
示范使用步骤(一):
已知a.txt文本文档中的内容为:你好啊
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("d:\\a.txt");
int len = 0;
while ((len = fr.read()) != -1){
System.out.println((char)len);
}
fr.close();
}
得到的结果为:
示范使用步骤(二):
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("d:\\a.txt");
char[] cs = new char[1024];
// 这里的len表示的是每次有效读取的个数
int len = 0;
while ((len = fr.read(cs)) != -1){
// String(char[] value, int offset, int count)该构造方法的作用是将字符数组的一部分转换为字符串
// offset表示数组开始的索引
// count表示传唤的个数
System.out.println(new String(cs, 0, len));
}
fr.close();
}
运行的结果为:
由于使用的是int read(char[] cbuf)
构造方法,所以导致的最后第一次输出就把你好啊都输出了,所以才没换行的