字符流
- 抽象类Reader和Writer时是字符流的顶级父类
- Reader是字符输入流,用于从某个源设备读取字符
- Writer是字符输出流,用于从某个原设备写入字符
注意:Reader和Writer是抽象类,不能被实例化
Reader和Writer提供不同的子类,这些子类的体系结构图如下:
FileReader和FileWriter用于读写文件,BufferedReader和BufferedWriter是具有缓冲功能的流,提高读写效率
字符流操作文件
- 字符输入流FileReader,从文件中读取一个或多个字符
当前目录下新建文本文件"reader.txt",并输入字符"好好学习,天天向上!",创建一个使用字符输入流FileReader读取文件中字符的类,如下代码:
package com.Put;
import java.io.FileReader;
public class IO {
public static void main(String[] args) throws Exception{
//创建FileReader对象,并指定要读取的文件
FileReader fileReader = new FileReader("reader.txt");
//定义一个int类型的变量len,其初始值为0
int len = 0;
//循环来判断是否读取到文件的末尾
while ((len=fileReader.read())!=-1){
System.out.print((char) len);
}
//关闭流
fileReader.close();
}
}
运行结果:
好好学习,天天向上!
简述:
由于字符流的read()方法返回的是int类型的值,如果想要获取字符就需要进行强制类型转换,输出语句将变量len强转为了char类型
- 字符输出流FileWriter,向文件中写入字符
代码如下:
package com.Put;
import java.io.FileWriter;
public class IO {
public static void main(String[] args) throws Exception{
//创建字符输出流,并指定文件
FileWriter fileWriter = new FileWriter("writer.txt");
//将定义的字符写入文件
fileWriter.write("轻轻的我走了,\r\n");
fileWriter.write("正如我轻轻的来了,\r\n");
fileWriter.write("我轻轻的招手,\r\n");
fileWriter.write("作别西天的云彩,\r\n");
//关闭流
fileWriter.close();
}
}
程序结束生成一个"writr.txt"的文件,如图:
FileWriter和FileOutputStream一样,如果文件不存在,创建新的文件,如果存在,首先会清空文件的内容;如果向追加数据,同样需要调用重载的构造方法
FileWriter fileWriter = new FileWriter("writer.txt",true);
字符流的缓冲区
字符流的缓冲区实现文件的拷贝
直接上代码:
package com.Put;
import java.io.FileReader;
import java.io.FileWriter;
public class IO {
public static void main(String[] args) throws Exception{
//创建FileReader对象,并指定要读取的文件
FileReader fileReader = new FileReader("reader.txt");
//创建FileWriter对象,并指定写入数据的目标文件
FileWriter fileWriter = new FileWriter("writer.txt",true);
//定义一个int类型的变量len,其初始值为0
int len = 0;
//定义一个长度为1024的字符数组
char[] buff = new char[1024];
//循环来判断是否读取到文件的末尾
while ((len=fileReader.read(buff))!=-1){
//输出读取到的字符
fileWriter.write(buff,0,len);
}
//关闭流
fileReader.close();
fileWriter.close();
}
}
运行效果(参数append为true,追加):
简述:
具体的创建与字节流缓冲区实现文件的拷贝类似,只是创建的缓冲区不一样,这里使用了new char[1024]创建一个字符缓冲区
字符缓冲流
- 字符流也提供了带缓冲区的字符缓冲流,分别是BufferedReader和BufferedWriter
- BufferedReader用于对字符输入流进行操作,BufferedWriter用于对字符输出流进行操作
- BufferedReader有一个重要的方法readLine()用于一次读取一行文本
package com.Put;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
public class IO {
public static void main(String[] args) throws Exception{
//创建一个字符输入缓冲流对象
BufferedReader br = new BufferedReader(new FileReader("reader.txt"));
//创建一个字符输出缓冲流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("writer.txt"));
//声明一个字符串变量str
String str = null;
//循环时每次读取一行文本,如果不为空(即到了文件的末尾),则继续循环
while ((str=br.readLine())!=null){
//通过缓冲流对象写入文件
bw.write(str);
//写入一个换行符,该方法会根据不同的操作系统生成相应的换行符
bw.newLine();
}
//关闭流
br.close();
bw.close();
}
}
简述:在拷贝过程中,每次循环都使用readLine()方法读取文件的一行,然后通过write()方法写入目标文件,同时使用了newLine()进行换行写入,否则读取源文件所有行内容都会追加写入目标文件的一行中。其中readLine()方法会逐个读取字符,当读到回车符"\r"或者换行符"\n"时会将读到的字符作为一行内容返回。
注意:字符缓冲流也使用了缓冲区,在调用BufferedWriter的write()方法写入字符时,这些字符首先会被写到缓冲区,当缓冲区写满时或调用close()方法时,缓冲区中的字符才会被写到目标文件。因此在循环结束时一定调用close()方法,否则会导致部分在缓冲区的内容没有被写道目标文件