前言
- 学习之前,需要对IO流的分类有个简单的认识,下列是关于本文的IO流分类介绍
IO流的分类
- 按流的方向划分
- 输入流
- 输出流
- 按流动的数据类型划分
- 字节流
- 字符流
本文提到的Reader、Writer属于字符流
- 字符流
- 输入流
- 顶级父类Reader
- 输出流
- 顶级父类Writer
- 字符流用于对文字进行读写操作,能够解决字节流读写字符产生的乱码问题
一、Writer
1、概述
- 用于写入字符流的抽象类
- 也就是字符输出流的顶级父类
2、常用API
abstract void close()
- 关闭流,并使用flush()方法清除缓存区内容
abstract void flush()
- 将缓存区的内容刷新到文件中
- 字符输出的时候,通常需要在后面跟上一个flush()操作,否则字符会保留在缓存中,而不是写入到文件中
void write(char[] cbuf)
- 写一个字符数组到文件中
- void write(char[] cbuf, int off, int len)
- 写一个字符数组到文件中,从off位置开始,写len个字符
void write(int c)
- 写一个字符到文件中
void write(String str)
- 写一个字符串到文件中
- void write(String str, int off, int len)
- 写一个字符串到文件中,从off位置开始,写len个字符
Writer append(char c)
- 将指定的字符追加到此字符输出流中
- 返回的是this,也就是调用该方法的字符输出流对象
- 调用该方法的对象,和该方法返回的对象是同一个对象
- 因此可以使用链式添加,即字符输出流对象.append(xxx).append(xxx).append(xxx)...
- 返回的是this,也就是调用该方法的字符输出流对象
二、FileWriter
1、概述
- 是字符输出流(Writer)的常用子类
2、构造方法分析
FileWriter(File file)
- 根据传入的文件构造一个字符输出流对象
- 如果对象不存在会自动创建
FileWriter(File file, boolean append)
- 根据传入的文件构造一个字符输出流对象
- append
- true
- 表示在file文件原有数据的基础上,继续写入数据
- false(默认)
- 表示把file文件的内容清空后,再写入数据
- true
FileWriter(File file,Charset charset)
- 根据传入的文件构造一个字符输出流对象
- 指定字符输出流对象的字符集编码
FileWriter(String fileName)
- 同FileWriter(File file),区别在于本构造器是使用文件的路径来创建字符输出流对象
FileWriter(String fileName, boolean append)
- 同FileWriter(File file, boolean append),区别在于本构造器是使用文件的路径来创建字符输出流对象
FileWriter(String fileName, boolean append,Charset charset)
- 同FileWriter(File file, boolean append,Charset charset),区别在于本构造器是使用文件的路径来创建字符输出流对象
3、举例
- 写入单个字符
public static void main(String[] args) throws IOException {
File file = new File("I:\\a.txt");
FileWriter writer = new FileWriter(file);
//写入一个字符
writer.write('c');
writer.close();
}
-
写入一个字符串
-
如果不用close方法,必须使用flush方法,否则数据缓存在内存中,无法写入文件
-
public static void main(String[] args) throws IOException {
File file = new File("I:\\a.txt");
FileWriter writer = new FileWriter(file);
//写入一组字符
writer.write("锄禾日当午,汗滴禾下土");
writer.flush();
// writer.close();
}
三、Reader
1、概述
- 用于读取字符流的抽象类
- 也就是字符输入流的顶级父类
2、常用API
abstract void close()
- 关闭流对象并释放与其关联的所有系统资源
int read()
- 读取一个字符
int read(char[] buf)
- 读取字符并存入buf数组
abstract int read(char[] cbuf, int off, int len)
- 从输入流中读取一些字符,存储到字符缓冲数组b中,并从off下标开始,读取b数组的len个数据
四、FileReader
1、概述
- 是字符输入流(Reader)的常用子类
2、构造器分析
FileReader(File file)
- 根据传入的文件对象创建字符输入流对象
FileReader(File file,Charset charset)
- 根据传入的文件对象创建字符输入流对象
- 指定字符输入流对象的字符集编码为charset
FileReader(String fileName)
- 根据传入的文件路径创建字符输入流对象
FileReader(String fileName,Charset charset)
- 根据传入的文件路径创建字符输入流对象
- 指定字符输入流对象的字符集编码为charset
3、举例
- 读取a.txt文件内容,打印内容为:“锄禾日当午,汗滴禾下土”
public static void main(String[] args) throws IOException {
File file = new File("I:\\a.txt");
FileReader reader = new FileReader(file);
//一次读取11个字符
char[] chars = new char[11];
//读取字符的个数
int len = -1;
while ((len = reader.read(chars))!=-1){
System.out.println(new String(chars,0,len));
}
reader.close();
}