Java程序中,一个字符等于两个字节。Reader 和 Writer 两个就是专门用于操作字符流的类。
Writer
Writer是一个字符流的抽象类。
它的定义如下:
public abstract class Writer implements Appendable, Closeable, Flushable
直接子类
BufferedWriter,
CharArrayWriter,
FilterWriter,
OutputStreamWriter,
PipedWriter,
PrintWriter,
StringWriter
详细细节可以参考Java API文档。
Reader
Reader是读取字符流的抽象类。
它的定义如下:
public abstract class Reader implements Readable, Closeable
直接子类
BufferedReader,
CharArrayReader,
FilterReader,
InputStreamReader,
PipedReader,
StringReader
字节流 vs 字符流
字节流和字符流的使用方式非常相似,都有read()、write()、close()、flush()这样的方法。
它们的有以下几点:
区别
(1)操作数据
字节流
主要操作byte类型的数据。主要核心类是InputStream类和OutputStream类。
字符流
主要操作字符,一个字符等于两个字节。主要核心类是Reader类和Writer类。
(2)是否使用缓冲区
字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的。
字符流在操作时是使用了缓冲区,通过缓冲区再操作文件。
(3)字节流和字符流哪个好
所有的文件在硬盘或传输时都是以
字节方式保存的,例如图片,影音文件等都是按字节方式存储的。
字符流无法读写这些文件。所以,除了纯文本数据文件使用字符流以外,其他文件类型都应该使用字节流方式。
文件字符流
文件字符流有两个类:FileWriter 和 FileReader。
它们提供了方法将字符写入到文件和将数据以字符形式从文件中读取出来。
一般情形下,文件字节流操作遵循以下几个步骤:
(1)使用File类绑定一个文件。
(2)把File对象绑定到流对象上。
(3)进行读、写操作。
(4)关闭输入、输出。
FileWriter
例 向文件中写入数据
import java.io.File;
import java.io.Writer;
import java.io.FileWriter;
public class WriterDemo {
public static void main(String args[]) throws Exception { // 异常抛出,不处理
// 第1步、使用File类找到一个文件
File f = new File("d:" + File.separator + "test.txt"); // 声明File对象
// 第2步、通过子类实例化父类对象
Writer out = new FileWriter(f);
// Writer out = new FileWriter(f, true); // 追加内容方式
// 第3步、进行写操作
String str = "Hello World!!!\r\n";
out.write(str); // 将内容输出
// 第4步、关闭输出流
out.close();
}
};
import java.io.Writer;
import java.io.FileWriter;
public class WriterDemo {
public static void main(String args[]) throws Exception { // 异常抛出,不处理
// 第1步、使用File类找到一个文件
File f = new File("d:" + File.separator + "test.txt"); // 声明File对象
// 第2步、通过子类实例化父类对象
Writer out = new FileWriter(f);
// Writer out = new FileWriter(f, true); // 追加内容方式
// 第3步、进行写操作
String str = "Hello World!!!\r\n";
out.write(str); // 将内容输出
// 第4步、关闭输出流
out.close();
}
};
FileReader
例 从文件中读取内容
import java.io.File;
import java.io.IOException;
import java.io.Reader;
import java.io.FileReader;
public class ReaderDemo01 {
// 将所有内容直接读取到数组中
public static int read1(Reader input, char[] c) throws IOException {
int len = input.read(c); // 读取内容
return len;
}
// 每次读取一个字符,直到遇到字符值为-1,表示读文件结束
public static int read2(Reader input, char[] c) throws IOException {
int temp = 0; // 接收每一个内容
int len = 0; // 读取内容
while ((temp = input.read()) != -1) {
// 如果不是-1就表示还有内容,可以继续读取
c[len] = (char) temp;
len++;
}
return len;
}
public static void main(String args[]) throws Exception {
// 第1步、使用File类找到一个文件
File f = new File("d:" + File.separator + "test.txt");
// 第2步、通过子类实例化父类对象
Reader input = new FileReader(f);
// 第3步、进行读操作
char c[] = new char[1024];
// int len = read1(input, c);
int len = read2(input, c);
// 第4步、关闭输出流
input.close();
System.out.println("内容为:" + new String(c, 0, len)); // 把字符数组变为字符串输出
}
};
import java.io.IOException;
import java.io.Reader;
import java.io.FileReader;
public class ReaderDemo01 {
// 将所有内容直接读取到数组中
public static int read1(Reader input, char[] c) throws IOException {
int len = input.read(c); // 读取内容
return len;
}
// 每次读取一个字符,直到遇到字符值为-1,表示读文件结束
public static int read2(Reader input, char[] c) throws IOException {
int temp = 0; // 接收每一个内容
int len = 0; // 读取内容
while ((temp = input.read()) != -1) {
// 如果不是-1就表示还有内容,可以继续读取
c[len] = (char) temp;
len++;
}
return len;
}
public static void main(String args[]) throws Exception {
// 第1步、使用File类找到一个文件
File f = new File("d:" + File.separator + "test.txt");
// 第2步、通过子类实例化父类对象
Reader input = new FileReader(f);
// 第3步、进行读操作
char c[] = new char[1024];
// int len = read1(input, c);
int len = read2(input, c);
// 第4步、关闭输出流
input.close();
System.out.println("内容为:" + new String(c, 0, len)); // 把字符数组变为字符串输出
}
};
参考资料
《Java编程思想》
《Java开发实战经典》