java采用16位的Unicode来表示字符串和字符,对应的数据流就称为字符流。Reader和Writer为字符流设计。FileReader是InputStreamReader的子类,而InputStreamReader是Reader的子类;FileWriter是OutputStreamWriter的子类,而OutputStreamWriter则是Writer的子类。字符流和字节流的区别在于,字符流操作的对象是字符及字符数组,而字节流操作的对象则是字节及字节数组。
字符输入流
FileReader的常用构造包括以下几种。
FileReader(String fileName):根据文件名创建FileReader对象。
FileReader(File file):根据File对象创建FileReader对象。
FileReader的常用方法包括以下几种。
int read():读取单个字符。返回字符的整数值,如果已经到达文件尾,则返回-1.
int read(char[] cbuf):将字符读入cbuf字符数组。返回读取到的字符数,如果已经到达文件尾,则返回-1.
int read(char[] cbuf,int off,int len):将读取到的字符存放到cbuf字符数组从off标识的偏移位置开始处,最多读取len个字符。
与字节流不同,BufferReader是Reader的直接子类,这一点和BufferInputStream是InputStream的二级子类有所不同。通过BufferReader.readLine()方法可以实现读取文本行、返回字符串,因为我们平时读取的文本文件大多是断行的,而且该方法能直接返回字符串,因此BufferReader使用得比FileReader更为广泛。
BufferReader用有以下两种构造方法。
BufferReader(Reader in):根据in代表的Reader对象创建BufferReader实例,缓冲区大小采用默认值。
BufferReader(Reader in,int sz):根据in代表的Reader对象创建BufferReader实例,缓冲区大小采用指定sz值。
BufferReader.readLine()方法遇到以下字符或者字符串认为当前行结束:‘\n’(换行符),'\r'(回车符),'\r\n'(回车换行)。返回值为该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回null。
BufferReader in=new BufferReader(new FileReader("C:/1.txt"));
String line=null;
while((line=in.readLine())!=null)
{
System.out.println(line);
}
in.close();
正如同BufferInputStream不仅可以用来读取文件一样,BufferReader也可以读取任意类型的字符输入流。
LineNumberReader是BufferReader的子类。在BufferReader以行方式读取字符流的基础上,LineNumberReader能通过getLineNumber()方法获取当前行号。行号默认是从1开始计数的,但是可以通过setLineNumber()方法随意设置行号,注意这种设置只对后续的getLineNumber()方法返回值生效,对文件内容没有任何影响。
字符输出流
FileWriter的常用构造有以下几种。
FileWriter(String fileName):根据文件名创建FileWriter对象。
FileWriter(String fileName,boolean append):根据文件名创建FileWriter对象,append参数用来指定是否在原文件之后追加内容。
FileWriter(File file):根据File对象创建FileWriter对象。
FileWriter(File file,boolean append):根据File对象创建FileWriter对象,append参数用来指定是否在原文件之后追加内容。
FileWriter的常用方法包括以下几种。
void writer(int c):向文件中写入正整数c代表的单个字符。
void writer(char[] cbuf):向文件中写入字符数组cbuf。
void writer(char[] cbuf,int off, in len):向文件中写入字符数组cbuf从偏移位置off开始的len个字符。
void writer(String str):向文件中写入字符串str,注意此方法不会在写入完毕之后自动换行。
void writer(String str,int off,int len):向文件中写入字符串str的从位置off开始、长度为len的一部分子串。
Writer append(char c):向文件中追加单个字符c。
Writer append(CharSequence csq):向文件中追加csq代表的一个字符序列。CharSequence是从JDK1.4版本开始引入的一个接口,代表字符值的一个可读序列,此接口对许多不同种类的字符序列提供统一的只读访问。
Writer append(CharSequence csq,int start,int end):向文件中追加csq字符序列的从位置start开始、end结束的一部分字符。
void flush():刷新字符输出流缓冲区。
void close():关闭字符输出流。
和BufferReader相对应,启用缓冲区的BufferWriter也拥有一下两种形式的构造方法。
BufferWriter(Writer out): 根据out代表的Writer对象创建BufferWriter实例,缓冲区大小采用默认值。
BufferWriter(Writer out,int sz):根据out代表的Writer对象创建BufferWriter实例,缓冲区大小采用指定的sz值。
我们知道,BufferReader类的readLine()方法能一次从输入流中读入一行,但对于BufferWriter类,却没有一次写一行的方法。若要向输出流中一次写一行,可用PrintWriter类(PrintWriter也是Writer的直接子类)将原来的流改造成新的打印流,PrintWriter类有一个方法println(String),能一次输出一行,即在待输出的字符串后自动补“\r\n”.