流操作规律
一、流操作的源和目的可分为以下:
1、源:键盘录入
目的:控制台2、需求,想把键盘录入的数据存储到文件中
源:键盘
目的:文件
只需要将原来在控制台的OutputStreamWriter osw=new OutputStreamWriter(System.out)中的System.out换成需要存储到的文件即可
3、需求,想要将一个文件的数据打印在控制台上。
源:文件
目的:控制台
源发生变化,则将BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));中的System.in换成文件而打印输出仍然是在控制台,所以OutputStreamWriter osw=new OutputStreamWriter(System.out)不变。
二、总结:
流操作的基本规律:最痛苦的就是流对象有很多,不知道该用哪一个。通过两个明确来完成
1、明确源和目的。
源为输入流,若读取数据则为输入流,则有InputStream,Reader。
目的为输出流。输出流则有OutputStream和Writer
2、明确操作的数据是否是纯文本。
是:用字符流。不是就用字节流。
通过两个明确就知道该用哪个体系,当体系明确后再明确使用哪个具体对象。通过设备来区分,源设备包括内存,硬盘,键盘。目的设备有内存,硬盘,文件,控制台。
1、需求:将一个文本文件中的数据存储到另一个文件中,复制文件。
源:因为是源,所以使用读取流,InputStream,Reader文件,因为是文本文件,这是可以使用reader。这样体系就明确了。接下来明确要使用该体系中的哪个对象。明确设备:硬盘上的一个文件。Reader体系中可以操作文件的对象FileReader。再看是否需要提高效率,是!加入Reader体系中缓冲区,BufferedReader br=new BufferedReader(fr);
目的:OutputStream和Writer.目的为纯文本的明确Writer,明确设备为硬盘,则Writer体系中可以操作文件的对象是FileWriter。FileWriter fr=new FileWriter("");再看是否需要提高效率,是!加入再看是否需要提高效率,是!加入v体系中缓冲区,BufferedWriter bw=new BufferedWriter(fw);
2、需求:将键盘录入的数据保存到文件中。
这个需求中有源和目的都存在,那么分别分析源:InputStream,Reader文件,是不是纯文本?是!用Reader。设备:键盘。对应的对象为System.in。选择Reader,而System.in对应的是字节流,为了操作键盘的文本数据操作方便,转成字符流,按照字符串操作最方便。所以,既然明确了Reader,那么就将System.in转成Reader,则用了Reader体系中的转换流InputStreamReader。则InputStreamReader isr=new InputStreamReader(System.in);
需要提高效率,则使用BufferedReader。BufferedReader bufr=new BufferedReader(isr);目的:OutputStream和Writer。是纯文本用字符流Writer。设备是硬盘。使用FileWriter.FileWriter fr=new FileWriter("");
需要提高效率,则用BufferedWriter bufr=new BufferedWriter(fr);
3、扩展一下,想要把录入数据按照指定编码表将数据存到文件中。
本来使用的是FileWriter,但是FileWriter使用的是默认编码表。而在存储时,需要加入指定编码表,而指定的编码表只有转换流可以指定,所以要是用的对象是OutputStreamWriter,而该转换流对象要接收一个字节输出流,而且还可以操作文件的字节输出流。FileOutputStream。OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("d.txt"),"UTF-8");
需要提高效率吗?需要BufferedWriter bufw=new BufferedWriter(osw);所以记住,转换流在字符和字节之间的桥梁,通常涉及到字符编码转换时需要用到转换流。