涉及到读写文件,我脑中常常会浮现出很多io操作类,但是一直搞不清楚他们之间的关系,以及什么情况下该用哪种。这次我花了两三天的功夫,终于把他们理了一遍。
从源头说起,Reader/Writer是所有字符流的根,InputStream/outputStream是所有字节流的根。
public abstract class Reader
extends Object
implements Readable, Closeable
Reader是个抽象类,直接继承它,我们常用的是读文件类BufferedReader,从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。public class BufferedReader
extends Reader常用构造方法:BufferedReader(Reader in)
通常,Reader 所作的每个读取请求都会导致对基础字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。
BufferedReader br = new BufferedReader(new FileReader(sourFile));
或者BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//键盘输入System.in,输入的是字节流
public class InputStreamReader
extends Reader
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符
public class FileReader
extends InputStreamReader
FileReader是用来读取字符文件的便捷类。
FileReader
用于读取字符流。要读取原始字节流,请考虑使用FileInputStream
。BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(sourFile)));//文件输入
public class FileInputStream
extends InputStream
FileInputStream
用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用FileReader。
public abstract class Writer
extends Object
implements Appendable, Closeable, Flushable
Writer是个抽象类,直接继承它,我们常用的写文件类是BufferedWriter,将文本写入字符输出流,缓冲各个字符,从而提供字符、数组和字符串的高效写入。public class BufferedWriter
extends Writer
常用构造方法:
BufferedWriter(Writer out)
通常 Writer 将其输出立即发送到基础字符或字节流,建议用 BufferedWriter 包装所有其 write() 操作可能开销很高的 Writer(如 FileWriters 和 OutputStreamWriters)。例如,
BufferedWriter bw = new BufferedWriter(new FileWriter(desFile));//文件输出
或者
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));//写的内容输出到控制台
public class OutputStreamWriter
extends Writer
OutputStreamWriter 是字符流通向字节流的桥梁:使用指定的 charset 将要向其写入的字符编码为字节。
public class FileWriter
extends OutputStreamWriter
FileWriter 用于写入字符流。要写入原始字节流,请考虑使用 FileOutputStream
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(desFile)));//原始字节流写到文件
public class FileOutputStream
extends OutputStream
FileOutputStream
用于写入诸如图像数据之类的原始字节的流。要写入字符流,请考虑使用FileWriter
。
示例
public static void main(String agrs[]) throws IOException{
System.out.println("===================键盘输入,控制台输出========================");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//键盘输入
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));//控制台输出
String line = null;
while(null!=(line=br.readLine())){
if("over".equals(line))
break;
bw.write(line);
bw.newLine();//如果没有这一行,控制台显示不会换行
bw.flush();//如果不刷新,会一直在缓冲池中,等输入结束显示
}
br.close();
bw.close();
}
public static void main(String agrs[]) throws IOException{
File desFile = new File("C:\\Users\\lenovo\\Desktop\\temp\\info.txt");
File sourFile = new File("C:\\Users\\lenovo\\Desktop\\temp\\YYPT\\Z71450700GRGMT0722");
System.out.println("===================文件输入,输出到文件========================");
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(sourFile)));//文件输入:InputStreamReader 是字节流通向字符流的桥梁
// BufferedReader br = new BufferedReader(new FileReader(sourFile));//文件输入
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(desFile)));//输出到文件:OutputStreamWriter 是字符流通向字节流的桥梁
// BufferedWriter bw = new BufferedWriter(new FileWriter(desFile));//输出到文件:字符流
String line = null;
while(null!=(line=br.readLine())){
bw.write(line);
bw.newLine();
bw.flush();
}
br.close();
bw.close();
}