之前介绍了字节流的读写,现在看看字符流的读写。其实字符流的读写是在字节流的读写的基础上完成的。通过读取字节流,获得了字节,然后再进行封装。所以JAVA流的本质还是字节。
字符流的读写主要这几个类:FileReader和FileWriter,BufferedReader和BufferedWriter。其类之间关系如下:
FileReader和FileWriter,BufferedReader和BufferedWriter它们之间的关系与字节流中的FileInputStream和FileOutputStream,BufferedInputStream和BufferedOutputStream差不多。
BufferedReader继承Reader类,同时还保存一个Reader变量,还有一个缓存;
同理,BufferedWriter继承Writer,同时还保存一个Writer变量,还有一个缓存;
道理与I/O(1)所讲差不多。相对FileReader和FileWriter,一般广泛使用的都是BufferedReader和BufferedWriter。正如之前所说的,字符流的操作都是针对字符和字符数组的操作,所以这流的基本单位是字符,即char。比如reader.read()返回的就是一个字符的整数值,而不是字节了。
字符流相对字节流而言,是一个更高级的抽象,所以其函数也会更加强大。例如BufferedReader里提供一个函数readLine()直接读取文件的一行字符,但是BufferedWriter没有提供相应的wirteLine()函数,但是可以在要写的内容加上"\r\n"即完成换行。看下面的示例代码:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
public class Main {
public static void main( String []args ){
File source = new File( "/home/ziyao/source.java");
File dest = new File( "/home/ziyao/dest.java" );
FileReader fr = null;
FileWriter fw = null;
try{
fr = new FileReader( source );
fw = new FileWriter( dest );
//注意两个类的构造参数是相应的父类:Reader和Writer
BufferedReader br = new BufferedReader( fr );
BufferedWriter bw = new BufferedWriter( fw );
String line = null;
while( ( line=br.readLine())!=null ){
//BufferedWriteri没有相应的writeLine函数,
//所以写回去的时候,要加上"\r\n"
bw.write( line+"\r\n" );
}
}catch( Exception e ){
e.printStackTrace();
}finally{
try{
fr.close();
fw.close();
}catch( Exception e){
e.printStackTrace();
}
}
}
}