一、注意事项
1.字符流也可以拷贝文本文件,但不推荐使用
因为读取时会把字节转为字符,写出时还要把字符转回字节。
2.不可以拷贝非纯文本的文件
因为在读的时候会将字节转换为字符,在转换过程中,可能找不到对应的字符,就会用?代替;写出的时候会将字符转换成字节写出去,如果是?,直接写出,这样写出之后的文件就会产生乱码。
3.使用情况
程序需要读取一段文本,或者需要写出一段文本的时候可以使用字符流
读取的时候是按照字符的大小读取的,不会出现半个中文
写出的时候可以直接将字符串写出,不用转换为字节数组
二、方法一
public static void demo1() throws FileNotFoundException, IOException {
FileReader fr = new FileReader("xxx.txt");
FileWriter fw = new FileWriter("zzz.txt");
int c;
while((c = fr.read()) != -1) {
fw.write(c);
}
fr.close();
fw.close();
}
注:Writer类中有一个2k的小缓冲区,如果不关流,就会将内容写到缓冲区里;关流会将缓冲区内容刷新,再关闭
private char[] writeBuffer;
private static final int WRITE_BUFFER_SIZE = 1024;
三、方法二(自定义字符数组的拷贝)
public static void demo3() throws FileNotFoundException, IOException {
FileReader fr = new FileReader("xxx.txt");
FileWriter fw = new FileWriter("yyy.txt");
char[] arr = new char[1024*8];
int len;
while((len = fr.read(arr)) != -1) { //将文件上的数据读取到字符数组中
fw.write(arr,0,len); //将字符数组中的数据写到文件上
}
fr.close();
fw.close();
}
四、方法三(带缓冲的字符流)
BufferedReader的read()方法读取字符时会一次读取若干字符到缓冲区, 然后逐个返回给程序, 降低读取文件的次数,,提高效率
BufferedWriter的write()方法写出字符时会先写到缓冲区,缓冲区写满时才会写到文件,降低写文件的次数,提高效率
BufferedReader(Reader in)
创建一个使用默认大小输入缓冲区的缓冲字符输入流。
BufferedWriter(Writer out)
创建一个使用默认大小输出缓冲区的缓冲字符输出流。
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("xxx.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("yyy.txt"));
int c;
while((c = br.read()) != -1) {
bw.write(c);
}
br.close();
bw.close();
}
五、方法四(带缓冲区流中的特殊方法)
String
readLine()
读取一个文本行。
void
newLine()
写入一个行分隔符。
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("zzz.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("aaa.txt"));
String line;
while((line = br.readLine()) != null) {
bw.write(line);
bw.newLine(); //bw.write("\r\n");
}
br.close();
bw.close();
}