目录
三个明确
通过三个明确来完成:
1.明确源和目的。
源: 输入流 InputStream Reader
目的: 输出流 OutputStream Writer
2.操作的数据是否是纯文本。
是: 字符流 Reader Writer
不是: 字节流 InputStream OutputStream
3.当体系明确后,再明确要使用哪个具体的对象。
通过设备来区分:
源设备:
键盘 System.in, 硬盘 FileStream, 内存 ArrayStream…(内存流)
目的设备:
控制台 System.out, 硬盘 FileStream, 内存 ArrayStream…(内存流)
案例思路分析
案例一
需求:将一个文本文件中数据存储到另一个文件中,复制文件。
源:因为是源,所以使用输入流: InputStream Reader
操作文本文件,纯文本 选Reader
这样体系就明确了。
接下来明确要使用该体系中的哪个对象。
明确设备:硬盘。 文件
Reader体系中可以操作文件的对象是FileReader
是否需要提高效率:是
加入Reader体系中的缓冲区 BufferedReader
FileReader fr=new FileReader("a.txt");
BufferedReader bufr=new BufferedReader(fr);
目的:输出流 OutputStream Writer
操作纯文本 选Writer
设备:硬盘。 一个文件
Writer体系中可以操作文件的对象FileWriter
加入Writer体系中的缓冲区提高效率 BufferedWriter
FileWriter fw=new FileWriter("b.txt");
BufferedWriter bufw=new BufferedWriter(fw);
案例二
需求:将一个图片文件中数据存储到另一个文件中,复制图片。
源:输入流 InputStream Reader
操作图片文件,不是纯文本 InputStream
这样体系就明确了。
接下来明确要使用该体系中的那个对象。
明确设备:硬盘。 文件
InputStream体系中可以操作文件的对象是FileInputStream
加入InputStream体系中的缓冲区提高效率:BufferedInputStream
FileInputStream fis=new FileInputStream("1.jpg");
BufferedInputStream bufis=new BufferedInputStream(fis);
目的:输出流 OutputStream Writer
操作图片文件,不是纯文本 OutputStream
设备:硬盘。 一个文件
OutputStream体系中可以操作文件的对象FileOutputStream
加入OutputStream体系中的缓冲区提高效率:BufferedOutputStream
FileOutputStream fos=new FileOutputStream("2.jpg");
BufferedOutputStream bufos=new BufferedOutputStream(fos);
案例三:涉及转换流
需求:将键盘录入的数据保存到一个文件中。
源:输入流 InputStream Reader
键盘录入,纯文本 Reader
设备:键盘录入 System.in
但System.in对应的是字节流对象,所需要用到转换流,将InputStream转换为Reader
使用Reader体系中的转换流InputStreamReader
InputStreamReader isr=new InputStreamReader(System.in);
需要提高效率:
BufferedReader bufr=new BufferedReader(isr);
目的:输出流 OutputStream Writer
纯文本 Wirter
设备:硬盘。 一个文件
FileWriter fw=new FileWriter("c.txt");
需要提高效率:
BufferedWriter bufw=BufferedWriter(fw);
扩展一下:
想要把录入的数据按照指定的编码表(utf-8),将数据存到文件中。
目的:输出流: OutputStream Writer
纯文本 Writer
设备:硬盘。 一个文件
但是FileWriter是使用默认编码表。GBK。
按照需要要使用utf-8编码表,但只有字节流才可以指定编码表
所以要使用Writer体系中的转换流:OutputStreamWriter
OutputStreamWriter osw=OutputStreamWriter(new FileOutputStream("d.txt"),"UTF-8");
需要提高效率:
BufferedWriter bufw=new BufferedWriter(osw);
注意:
转换流什么时候使用:
转换流是字符和字节之间的桥梁,通常,涉及到字符编码转换时,需要用到转换流。
示例
1. 需求:把键盘录入转换成大写打印在控制台上。
源:键盘录入。
目的:控制台。
2.需求:想把键盘录入的数据存储到一个文件中。
源:键盘录入。
目的:文件。
3.需求:想要将一个文件的数据打印在控制台上。
源:文件。
目的:控制台。
public static void main(String[] args)throws IOException{
// 键盘的最常见写法
// BufferedReader bufr =new BufferedReader(new InputStreamReader(System.in));
BufferedReader bufr =new BufferedReader(new FileReader("CopyPic.java"));
// 控制台的常见写法
// BufferedWriter bufw=new BufferedWriter(new FileWriter("out.txt"));
BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(System.out));
String line=null;
while((line=bufr.readLine())!=null){
if("over".equals(line))
break;
bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();
}
bufr.close();
bufw.close();
}