字符流以16位的字符为单位进行读与写操作。其体系都是以Reader和Writer为基类派生出来。这两个类是抽象类,作为字符流的模版。
1.Writer和FileWriter
1.1 Writer
Writer是写入字符流的抽象类。
其用于写的方法有如下几个:
void write(char c):写入单个字符。
void write(char[] cbuf):写入字符数组。
void write(char[] cbuf, int off, int len):写入字符数组的某一部分。
void write(String str):写入字符串。
void write(String str,int off, int len):写入字符串的某一部分。
可见,写入方法可以写单个字符、字符数组和字符串。
将字符串转换为字符数组可以使用String类的toCharArray()方法。
除了写的几个重载方法,还有以下几个方法:
void flush():刷新该流的缓冲。将流中的字符写入到目的地。
void close():关闭此流,但要先刷新它。
注:如果只调用write方法而没有调用flush或close方法,那么不会写入目标文件;如果调用write方法,没有调用flush方法,那么调用close方法关闭流,也会将字符写入到目标文件;如果多次调用write和flush,不会将文件中原内容覆盖,而是会在其后写入。
1.2 FileWriter
FileWriter是Writer的实现类,是用来写入字符文件的便捷类。
构造器:
FileWriter(String fileName):根据给定的文件名构造一个 FileWriter 对象。如果已存在该文件,则会覆盖。
FileWriter(String fileName, boolean append):根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。当append为true时,会在原文件后追加内容。
FileWriter(File file):根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(File file, boolean append):根据给定的 File 对象构造一个 FileWriter 对象。如果第二个参数为true,则将字节写入文件末尾处,而不是写入文件开始处。
注意:如果要换行,那么在windows操作系统中使用"\r\n",在linux系统使用“\n”。
见下面程序(在使用输入输出类的方法中,有许多方法会抛出异常,这里为了方便学习与查看,没有将异常处理而是抛出,后面会有详细的异常处理)
public class FileWriterDemo {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("c:\\demo.txt");
//写一个字符
fw.write('a');
//在Windows操作系统使用'\r\n'换行
fw.write("\r\n");
//刷新
fw.flush();
//写一个字符数组
char[] cbuf = {'b', 'c','d'};
fw.write(cbuf);
fw.write("\r\n");
fw.flush();
//写一个字符串
fw.write("hello");
fw.flush();
//关闭流
fw.close();
}
}
2.Reader和FileReader
2.1 Reader
Reader是用于读取字符流的抽象类。
其中用于读的方法有:
int read():读取单个字符。返回值是作为整数读取的字符,范围在 0 到 65535 之间 (0x00-0xffff),如果已到达流的末尾,则返回 -1。
将返回的字符输出时,需要进行强转(char)操作。
int read(char[] cbuf):将字符读入数组。返回值是读取的字符数,如果已到达流的末尾,则返回 -1 。
int read(char[] cbuf, int off, int len):将字符读入数组的某一部分。返回值是读取的字符数,如果已到达流的末尾,则返回 -1 。
可见,是否读到文件的末尾只要判断返回值是否为-1即可。
2.2 FileReader
FileReader是Reader的实现类。是用来读取字符文件的便捷类。
构造器:
FileReader(String fileName): 在给定从中读取数据的文件名的情况下创建一个新FileReader。
FileReader(File file):在给定从中读取数据的File的情况下创建一个新FileReader。
FileReader使用的是默认编码表,无法改变指定编码表。
见下面程序
public class FileReaderDemo {
public static void main(String[] args) throws IOException {
readByChar();
readByCharArray();
}
//使用读单个字符的方法
public static void readByChar()throws IOException {
//读取C盘demo文件
FileReader fr = new FileReader("c:\\demo.txt");
int ch = 0;
//判断是否读到结尾的方式是返回值是否为-1
while((ch = fr.read()) != -1){
//需要进行强转
System.out.print((char)ch);
}
}
//使用读字符数组的方法
public static void readByCharArray()throws IOException {
//读取C盘demo文件
FileReader fr = new FileReader("c:\\demo.txt");
//字符数组
char[] cbuf = new char[1024];
//读取的返回值,也是读取个数
int len = 0;
//判断是否读到结尾的方式是返回值是否为-1
while((len = fr.read(cbuf)) != -1){
System.out.print(new String(cbuf, 0, len));
}
}
}
3.BufferedReader和BufferedWriter
BufferedReader和BufferedWriter是带有缓冲的字符流。
3.1 BufferedReader
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。
构造器:
BufferedReader(Reader in):创建一个使用默认大小输入缓冲区的缓冲字符输入流。
方法:
String readLine():读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。返回值是包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null。
即该方法判断是否读到文件末尾只要判断返回值是否为null。
close():关闭该流并释放与之关联的所有资源。只需手动将带有缓存的字符流关闭即可,因为底层会将被包装的字符流关闭。
public class BufferedReaderDemo {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("C:\\demo.txt");
//带缓存的字符流,将要包装的字符流传入构造器
BufferedReader bufr = new BufferedReader(fr);
String line = null;
//判断是否读到末尾的方法是判断返回值是否为空
while((line = bufr.readLine()) != null){
System.out.println(line);
}
//只需要将带缓存的字符流关闭即可
bufr.close();
}
}
3.2 BufferedWriter
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
通常 Writer 将其输出立即发送到底层字符或字节流。除非要求提示输出,否则建议用 BufferedWriter 包装所有其 write() 操作可能开销很高的 Writer(如 FileWriters 和 OutputStreamWriters)。
构造器:
BufferedWriter(Writer writer):创建一个使用默认大小输出缓冲区的缓冲字符输出流。
方法:
void newLine():写入一个行分隔符。在不同系统,可以都调用这个方法来换行,而不必在使用特定平台的转义字符。
close():关闭此流,但要先刷新它。只需手动将带有缓存的字符流关闭即可,因为底层会将被包装的字符流关闭。
public class BufferedWriterDemo {
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("c:\\demo.txt");
//带缓冲的字符流
BufferedWriter bufw = new BufferedWriter(fw);
//写入一行字符串
bufw.write("java");
//换行
bufw.newLine();
bufw.write("hello");
bufw.newLine();
//刷新
bufw.flush();
//只需要将带缓存的字符流关闭即可
bufw.close();
}
}
4.LineNumberReader
LineNumberReader继承了BufferedReader。LineNumberReader是跟踪行号的缓冲字符输入流。此类定义了方法 setLineNumber(int) 和 getLineNumber(),它们可分别用于设置和获取当前行号。
public class LineNumberReaderDemo {
public static void main(String[] args) {
LineNumberReader lnr = null;
FileReader fr = null;
try{
fr = new FileReader("F:\\eclipse\\workspace\\test\\src\\io\\WriterEx.java");
lnr = new LineNumberReader(fr);
String line = null;
while((line = lnr.readLine()) != null){
System.out.println(lnr.getLineNumber() + " " + line);
}
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(lnr != null)
lnr.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}