文件读写操作

来源:互联网 发布:qq三国张飞和关羽js 编辑:程序博客网 时间:2024/06/06 00:39

涉及到读写文件,我脑中常常会浮现出很多io操作类,但是一直搞不清楚他们之间的关系,以及什么情况下该用哪种。这次我花了两三天的功夫,终于把他们理了一遍。

从源头说起,Reader/Writer是所有字符流的根,InputStream/outputStream是所有字节流的根。       

public abstract class Reader

extends Object

implements ReadableCloseable

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 AppendableCloseableFlushable

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();
}

0 0