问题背景:
当我们在进行IO流操作的时候,遇到最大的问题就是由于IO流对象有很多,导致我们不知道该选用哪一个具体的对象。这时我们就需要找到这些对象的特点,进而选择适合的对象进行相关操作。
三个明确:
我们可以通过三个明确来确定我们需要的对象。
-
明确源和目的:
源(读取流):InputStream Reader;
目的(写入流):OutputStream Writer;
-
明确操作的数据是否为纯文本(.txt格式):
是:字符流(Reader或Writer结尾);
否:字节流(Stream结尾);
-
明确体系后选择所需对象:
源设备:内存,硬盘,键盘; 目的设备:内存,硬盘,控制台。
1、需求:将一个文本文件中数据存储到另一个文件中,复制文本文件。
源:选择读取流,InputStream或Reader;
是纯文本:选择字符流,操作文件,使用FileReader;
需要提高效率:加入缓冲区,最终选择BufferedReader。
代码:
FileReader fr = new FileReader("a.txt");
BufferedReader bufr = new BufferedReader(fr);
目的:选择写入流,OutputStream或Writer;
是纯文本:选择字符流,操作文件,使用FileWriter;
需要提高效率:加入缓冲区,最终选择BufferedWriter。
代码:
FileWriter fw = new FileWriter("b.txt");
BufferedWriter bufw = new BufferedWriter(fw);
2、需求:将键盘录入的数据保存到一个文件中。
源:InputStream或Reader;
是纯文本:Reader;
源设备:键盘录入对应的对象是System.in,但由于Reader是字符流,System.in为InputStream类型,是字节流。所以需要将字节流转换成字符流操作纯文本数据,即将System.in转换成Reader,选择Reader体系中转换流,InputStreamReader;
需要提高效率:加入缓冲区,BufferedReader。
代码:
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader bufr = new BufferedReader(isr);
目的:OutputStream或Writer;
是纯文本:Writer;
目的设备:硬盘中的一个文件,操作文件选择FileWriter;
需要提高效率:加入缓冲区,BufferedWriter 。
代码
FileWriter fw = new FileWriter("c.txt");
BufferedWriter bufw = new BufferedWriter(fw);
3、需求:将键盘录入的数据按照指定的编码表(utf-8)存储到文件中。
源:InputStream或Reader;
是纯文本:Reader;
源设备:键盘录入对应的对象是System.in,但由于Reader是字符流,System.in为InputStream类型,是字节流。所以需要将字节流转换成字符流操作纯文本数据,即将System.in转换成Reader,选择Reader体系中转换流,InputStreamReader;
需要提高效率:加入缓冲区,BufferedReader。
代码:
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
目的:OutputStream或Writer;
是存文本:Writer;
目的设备:硬盘中的一个文件,操作文件选择FileWriter;由于FileWriter使用的默认编码表GBK,但是存储时,需
要加入指定编码表utf-8,而编码表只有转换流可以指定,所以要使用的转换流对象OutputStreamWriter;
需要提高效率:加入缓冲区,BufferedReader。
代码:
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("d.txt"),"UTF-8");
BufferedWriter bufw = new BufferedWriter(osw);
注意:通常涉及到字符编码转换时,需要用到转换流。
4、键盘录入最常用写法
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));