字符流是以字符为单位处理流中的数据, 也可以说是以字符为单位读写文件的内容。
FileReader/FileWriter字符流只能读写纯文本文件, 并且要求文本文件的编码与当前环境的编码要兼容。
package com.wkcto.chapter06.readerwriter;
import java.io.FileReader;
import java.io.IOException;
/**
* FileReader/FileWriter字符流
* 1)只能读写纯文本文件
* 2)要求文本文件的编码与当前环境的编码兼容
* @author 蛙课网
*
*/
public class Test01 {
public static void main(String[] args) throws IOException {
//1)使用FileReader读取文本文件: d:/abc.txt中的内容, 该文件使用GBK编码, 文件中全部是英文字符
// readFile1();
//2) 读取d:/log.txt文件的内容, 该文件使用UTF-8编码, 文件中有中文也有英文字符
readFile2();
}
//使用FileReader读取文件, 一次读取一个字符数组
private static void readFile2() throws IOException {
FileReader fReader = new FileReader("d:/log.txt");
// FileReader fReader = new FileReader("d:/test01.java"); //该文件使用GBK编码,当前环境使用UTF-8编码, 文件中有中文也有英文
char [] contents = new char[8];
//从文件中读取字符保存到字符数组中, 返回读到的字符个数, 如果读到文件末尾返回-1
int len = fReader.read(contents);
while( len != -1 ){
//把读到的len个字符转换为字符串打印到屏幕上
System.out.print( new String(contents, 0 ,len ));
len = fReader.read(contents);
}
fReader.close();
}
private static void readFile1() throws IOException {
FileReader fr = new FileReader("d:/abc.txt");
//read()读取一个字符, 返回该字符的码值, 读到文件末尾返回-1
int cc = fr.read();
while( cc != -1 ){
System.out.print( (char)cc );
cc = fr.read();
}
fr.close();
}
}
package com.wkcto.chapter06.readerwriter;
import java.io.FileWriter;
import java.io.IOException;
/**
* FileWriter
* 可以把字符保存到文本文件中, 该文本文件要与当前环境编码兼容
* @author 蛙课网
*
*/
public class Test02 {
public static void main(String[] args) throws IOException {
// FileWriter fw = new FileWriter("d:/def.txt"); //以覆盖的方式打开 文件,如果原来的文件格式是GBK,写入后文件的格式变为UTF-8
FileWriter fw = new FileWriter("d:/def.txt", true); //以追加的方式打开 文件,如果原来的文件格式是GBK,写入后文件会出现乱码
//一次写一个字符
fw.write('A');
fw.write('中');
//一次写一个字符数组
char [] contents = "wkcto是一个NB的网站".toCharArray();
fw.write(contents);
fw.write("还可以一次写一个字符串");
fw.write("\r\n"); //换行
fw.close();
}
}
package com.wkcto.chapter06.readerwriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
* 使用FileReader/FileWriter实现文本文件的复制
* 文本文件的编码要与当前环境的编码兼容
* @author 蛙课网
*
*/
public class Test03 {
public static void main(String[] args) {
String srcfile = "d:/test.java";
String destfile = "d:/javase/wk.txt" ;
// copyfile( srcfile, destfile) ; //逐个字符复制, 异常处理, 手动关闭流
copyfile2( srcfile, destfile) ; //一次复制一个字符数组, 异常处理, 自动关闭流
}
//一次复制一个字符数组, 异常处理, 自动关闭流
private static void copyfile2(String srcfile, String destfile) {
try (
FileReader fr = new FileReader(srcfile);
FileWriter fw = new FileWriter(destfile);
){
char [] contents = new char[1024];
int len = fr.read(contents);
while( len != -1 ){
fw.write(contents, 0, len);
len = fr.read(contents);
}
} catch (Exception e) {
}
}
//逐个字符复制, 异常处理, 手动关闭流
private static void copyfile(String srcfile, String destfile) {
FileReader fr = null;
FileWriter fw = null;
try {
fr = new FileReader(srcfile);
fw = new FileWriter(destfile);
int cc = fr.read();
while( cc != -1 ){
//把读到的字符cc保存到fw输出流中
fw.write(cc);
//继续读下个字符
cc = fr.read();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if ( fr != null ) {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fw != null) {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}