Writer类是在JDK1.1之后增加的,其类的定义如下:
java.io java.lang.Object java.io.Writer 所有已实现的接口: Closeable, Flushable, Appendable |
这个类又多实现了一个Appendable接口。这个接口定义如下:
java.lang 所有已知实现类: BufferedWriter, CharArrayWriter, CharBuffer, FileWriter, FilterWriter, LogStream, OutputStreamWriter, PipedWriter, PrintStream, PrintWriter, StringBuffer, StringBuilder, StringWriter, Writer |
在Appendable接口里面定义了追加的操作,而且追加的数据都是字符或字符串。
Writer类定义有以下方法:
输出全部字符数组:public void write(char[] cbuf) throws IOException |
输出字符串:public void write(String str) throws IOException (Writer类最大的特征) |
Writer是抽象类,若想实例化则应该用FileWriter子类。
【范例】使用Writer类实现内容输出。
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
public class Test {
public static void main(String[] args) throws Exception {
// 1.定义要输入文件的路径
File file = new File("D:" + File.separator + "demo" + File.separator + "1.txt");
if (!file.getParentFile().exists()) {
file.getParentFile().mkdir();
}
// 2.实例化Writer类的对象
Writer w = new FileWriter(file);
// 3.进行内容输出
String s = "hello world\r\n";
w.write(s); // 输出字符串数据
// 4.关闭输出流
w.close();
}
}
结论:可以发现Writer作为字符输出流,可以直接进行字符串输出。
Reader类是进行字符数据读取的输入流,其本身也是一个抽象类。
java.io java.lang.Object java.io.Reader 所有已实现的接口: Closeable, Readable |
在Reader类里面也提供有一系列的read()方法:(没有返回字符串的方法)
读取内容到字符数组:public int read(char[] cbuf) 返回值:表示读取的数据长度,若读取到结尾返回-1。 |
Reader类实例化可用FileReader子类完成:
【范例】使用Reader读取数据。
import java.io.File;
import java.io.FileReader;
import java.io.Reader;
public class Test {
public static void main(String[] args) throws Exception {
// 1.定义要输入的文件的路径
File file = new File("D:" + File.separator + "demo" + File.separator + "1.txt");
if (file.exists()) {
// 2.为Reader类对象实例化
Reader in = new FileReader(file);
// 3.进程数据读取
char[] data = new char[1024];
int len = in.read(data);
// 4.关闭输入流
in.close();
System.out.println(new String(data, 0, len));
}
}
}
结论:与字节输入流相比结构几乎一样的,只是数据类型由byte更换为了char而已。
开发中到底该使用哪种,有什么区别?
字节流与字符流最大的区别是:字节流直接与终端进行数据交互,而字符流需要将数据经过缓冲区处理后才可以输出。
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
public class Test {
public static void main(String[] args) throws Exception {
File file = new File("D:" + File.separator + "demo" + File.separator + "1.txt");
if (!file.getParentFile().exists()) {
file.getParentFile().mkdir();
}
Writer w = new FileWriter(file);
String s = "hello world\r\n";
w.write(s); // 输出字符串数据
// w.close(); //若没有释放,则不会在1.txt内容写入内容
}
}
结论:在使用OutputStream输出数据时,即使最后没有关闭输出流,那么内容也能正常输出;繁殖,若使用的是字符输出流,不关闭表示在缓冲区之中,处理的内容不会被强制性清空,所以就不会输出数据。若现在有特殊情况不能关闭字符输出流,可以使用flush()方法强制清空缓冲区。
【范例】强制清空字符流缓冲区。
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
public class Test {
public static void main(String[] args) throws Exception {
File file = new File("D:" + File.separator + "demo" + File.separator + "1.txt");
if (!file.getParentFile().exists()) {
file.getParentFile().mkdir();
}
Writer w = new FileWriter(file);
String s = "hello world\r\n";
w.write(s); // 输出字符串数据
w.flush(); // 强制清空缓冲区
// w.close(); //若没有释放,则不会在1.txt内容写入内容
}
}
字符流使用到缓冲区的最好的证据!
在开发中,对于字节数据处理是比较多的,例如:图片,音乐,电影,文字。而对于字符流最大的好处是它可以进行中文的有效处理。
【注意】在日后的开发之中,若要处理中文优先考虑字符流,没有中文问题的话建议使用字节流。
1. 字节流的输入及输出操作的代码必须掌握熟练;
OutputStream和InputStream类中的write()和read()方法必须掌握清楚。
2. 中文处理的时候强烈建议使用字符流。