IO流之FileReader与FileWriter
一、字符流FileReader
1,字符流是什么
*字符流是可以直接读写字符的IO流
*字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写出.
2,FileReader
*FileReader类的read()方法可以按照字符大小读取
Java Code
1 2 3 4 5 6 7 |
FileReader fr = new FileReader("aaa.txt"); //创建输入流对象,关联aaa.txt int ch; while((ch = fr.read()) != -1) { //将读到的字符赋值给ch System.out.println((char)ch); //将读到的字符强转后打印 } fr.close(); |
二、字符流FileWriter
* FileWriter类的write()方法可以自动把字符转为字节写出
Java Code
1
2 3 |
FileWriter fw =
new
FileWriter(
"aaa.txt"
); fw.write( "aaa" ); fw.close(); |
三、示例
1,字符流的拷贝
Java Code
1
2 3 4 5 6 7 8 9 10 |
FileReader fr =
new
FileReader(
"a.txt"
); FileWriter fw = new FileWriter( "b.txt" ); int ch; while ((ch = fr.read()) != - 1 ) { fw.write(ch); } fr.close(); fw.close(); |
2,自定义字符数组的拷贝
Java Code
1
2 3 4 5 6 7 8 9 10 11 |
FileReader fr =
new
FileReader(
"aaa.txt"
);
//创建字符输入流,关联aaa.txt FileWriter fw = new FileWriter( "bbb.txt" ); //创建字符输出流,关联bbb.txt int len; char [] arr = new char [ 1024 * 8 ]; //创建字符数组 while ((len = fr.read(arr)) != - 1 ) { //将数据读到字符数组中 fw.write(arr, 0 , len); //从字符数组将数据写到文件上 } fr.close(); //关流释放资源 fw.close(); |
四、带缓冲的字符流
* BufferedReader的read()方法读取字符时会一次读取若干字符到缓冲区, 然后逐个返回给程序, 降低读取文件的次数, 提高效率
* BufferedWriter的write()方法写出字符时会先写到缓冲区, 缓冲区写满时才会写到文件, 降低写文件的次数, 提高效率
Java Code
1
2 3 4 5 6 7 8 9 10 |
BufferedReader br =
new
BufferedReader(
new
FileReader(
"aaa.txt"
));
//创建字符输入流对象,关联aaa.txt BufferedWriter bw = new BufferedWriter( new FileWriter( "bbb.txt" )); //创建字符输出流对象,关联bbb.txt int ch; while ((ch = br.read()) != - 1 ) { //read一次,会先将缓冲区读满,从缓冲去中一个一个的返给临时变量ch bw.write(ch); //write一次,是将数据装到字符数组,装满后再一起写出去 } br.close(); //关流 bw.close(); |
四、其他
1,什么情况下使用字符流
* 字符流也可以拷贝文本文件, 但不推荐使用. 因为读取时会把字节转为字符, 写出时还要把字符转回字节.
* 程序需要读取一段文本, 或者需要写出一段文本的时候可以使用字符流
* 读取的时候是按照字符的大小读取的,不会出现半个中文
* 写出的时候可以直接将字符串写出,不用转换为字节数组
2,使用指定的码表读写字符
* FileReader是使用默认码表读取文件, 如果需要使用指定码表读取, 那么可以使用InputStreamReader(字节流,编码表)
* FileWriter是使用默认码表写出文件, 如果需要使用指定码表写出, 那么可以使用OutputStreamWriter(字节流,编码表)
Java Code
1
2 3 4 5 6 7 8 9 10 11 |
BufferedReader br =
//高效的用指定的编码表读 new BufferedReader( new InputStreamReader( new FileInputStream( "UTF-8.txt" ), "UTF-8" )); BufferedWriter bw = //高效的用指定的编码表写 new BufferedWriter( new OutputStreamWriter( new FileOutputStream( "GBK.txt" ), "GBK" )); int ch; while ((ch = br.read()) != - 1 ) { bw.write(ch); } br.close(); bw.close(); |
3,readLine()和newLine()方法
* BufferedReader的readLine()方法可以读取一行字符(不包含换行符号)
* BufferedWriter的newLine()可以输出一个跨平台的换行符号"\r\n"
Java Code
1
2 3 4 5 6 7 8 9 10 11 |
BufferedReader br =
new
BufferedReader(
new
FileReader(
"aaa.txt"
)); BufferedWriter bw = new BufferedWriter( new FileWriter( "bbb.txt" )); String line; while ((line = br.readLine()) != null) { bw.write(line); //bw.write("\r\n"); //只支持windows系统 bw.newLine(); //跨平台的 } br.close(); bw.close(); |