1.字符流
当使用字节流读取文本文件时,遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。
1个中文
GBK:占用两个字节
UTF-8:占用3个字节
1.1 字符输入流【Reader】
java.io.Reader:字符输入流,是字符输入流的最顶层的父类,定义了一些共性的成员方法,是一个抽象类
共性的成员方法:
int read() 读取单个字符并返回
int read(char[] cbuf)一次读取多个字符,将字符读入数组
void close() 关闭该流并释放与之关联的所有资源
java.io.FileReader extends InputStreamReader extends Reader
1.2 FileReader类
FileReader:文件字符输入流
作用:把硬盘文件中的数据以字符的方式读取到内存中
1. 字符编码:字节与字符的对应规则。Windows系统的中文编码默认是GBK编码表。
idea中UTF-8
2. 字节缓冲区:一个字节数组,用来临时存储字节数据
1.3构造方法:
FileReader(String fileName)
FileReader(File file)
参数:读取文件的数据源
String fileName:文件的路径
File file:一个文件
FileReader构造方法的作用:
1.创建一个FileReader对象
2.会把FileReader对象指向要读取的文件
字符输入流的使用步骤:
1.创建FileReader对象,构造方法中绑定要读取的数据源
2.使用FileReader对象中的方法read读取文件
3.释放资源
代码:
import java.io.FileReader;
import java.io.IOException;
public class Demo02Reader {
public static void main(String[] args) throws IOException {
//1.创建FileReader对象,构造方法中绑定要读取的数据源
FileReader fr = new FileReader("day09_IOAndProperties\\b.txt");
//2.使用FileReader对象中的方法read读取文件
/*int read = 0;
while((read = fr.read()) != -1){
System.out.print((char) read);
}*/
//int read(char[] cbuf)一次读取多个字符,将字符读入数组
char[] cs = new char[1024];
int len = 0;//记录的是每次读取的有效的字符个数
while((len = fr.read(cs))!=-1){
/*
String类的构造方法
String(char[] value) 把字符数组转换为字符串
String(char[] value,intoffset,int count) 把字符数组的一部分转换为字符串,offset数组的开始索引,count转换的个数
*/
System.out.println(new String(cs,0,len));
}
// 3.释放资源
fr.close();
}
程序演示:
-
读取字符: read 方法,每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回 -1 ,循环读取,结果演示:
-
使用字符数组读取: read(char[] cbuf) ,每次读取b的长度个字符到数组中,返回读取到的有效字符个数,读取到末尾时,返回 -1 ,代码使用演示: