当使用字节流读取文件时,遇到中文字符时,可能不会显示完整的字符,因为一个中文字符可能占用多个字节储存。所以java提供一些字符流类,以字符为单位读写数据,专门处理文本文件
一个汉字储存:
GBK编码:占用2个字节
UTF-8编码:占用3个字节
字符输入流Reader:
java.io.Reader抽象类:用于读取字符流的所有类的超类,可以读取字符信息到内存中。
int read():读取单个字符并返回
int read(char[] cbuf ):一次读取多个字符,将字符读入数组
void close():关闭该流并释放与之关联的所有资源
文件输入流:
java.io.FileReader:文件字符输入流,把文件中的字符读取到内存中
构造方法:
FileReader(String fileName)
FileReader(File file)
fileName:文件路径 FIle:文件
使用:
1、创建FileReader对象,构造方法中绑定要读取的数据源
2、使用FileReader对象中的方法read读取文件
3、释放资源
一次读取一个字符
FileReader fr=new FileReader("C:\\Users\\暮色年华\\Desktop\\a.txt");
int len=0;
while((len=fr.read())!=-1){
System.out.print((char)len);
}
fr.close();
一次读取多个字符
String(char[] value,int offset,int len):把字符数组的一部分转换为字符串
FileReader fr=new FileReader("C:\\Users\\暮色年华\\Desktop\\a.txt");
char[]cs=new char[1024];
int len=0;
while((len=fr.read(cs))!=-1){
System.out.println(new String(cs,0,len));
}
fr.close()
字符输出流:
OutputStreamWriter:
文件字符输出流:
FileWriter(String FileName,boolean append)
FileWriter(File file,boolean append)
一次写入一个字符
FileWriter fw=new FileWriter("C:\\Users\\暮色年华\\Desktop\\a.txt");
fw.write(97);
fw.flush();
fw.write(98);
fw.close();
写入字符后,必须先刷新,才能写入到文件中去
void flush():刷新流 flush调用可以进行写数据
void close():关闭流,先刷新 close调用后不能继续写数据
一次写入多个字符
FileWriter fw=new FileWriter("C:\\Users\\暮色年华\\Desktop\\a.txt");
char[] chs={'a','b','c'};
fw.write(chs);
fw.close();
一次写入一个字符串
FileWriter fw=new FileWriter("C:\\Users\\暮色年华\\Desktop\\a.txt");
String s="asdc";
fw.write(s);
fw.close();
字符流的续写和换行
续写:append参数设为TRUE
换行:换行符
使用try..catch...finally处理流中的异常
JDK9:try前边可以定义流对象,在try后边的()中可以直接引用流对象的名称(变量名)
在try代码执行完毕之后,流对象也可以释放掉,不用写finally