本帖最后由 一叶障目 于 2014-11-13 22:07 编辑
一直对io流很头晕,因为流对象太多,下面的总结让我豁然开朗,分享给大家:(试着自己打过一遍以后,io的感觉还是比较差,还得回去好好复习复习)
流的规律:流对象很多,遇到问题难以选择,只需要通过四个明确即可:
1、明确源和目的
源 | InputStream | Reader | 目的 | OutStream | Writer | 2、明确操作的数据是否纯文本数据:是否纯文本 | 是 | 否 | 源 | Reader | InputStream | 目的 | Writer | OutStream | 3、明确具体的设备:设备 | 硬盘 | 内存 | 网络 | 键盘 | 控制台 | 源 | File | 数组 | Socket流 | System.in |
| 目的 | File | 数组 | Socket流 |
| System.ou | 4、是否需要额外的功能:
1、是否需要高效:需要就加上Buffer
2、字符与字节转换具体例子:需求一:复制一个文本文件;
1、明确目的和源
源: Reader InputStream
目的: Writer OutputStream
2、明确是否纯文本数据:是
源: Reader
目的: Writer
3、明确具体设备
源:硬盘 File
目的:硬盘 File
FileReader fr=new FileReader("a.txt");
FileWriter fw=new FileWriter("b.txt");
4、是否需要额外功能:需要,高效
BufferedReader bufr=new BufferedReader(new FileReader("a.txt"));
BufferedWriter bufw=new BufferedWriter(new FileWriter("b.txt"));
需求二:读取键盘录入信息,并写入到一个文件中;
1、明确源和目的
源: Reader InputStream
目的: Writer OutputStream
2、明确是否纯文本数据:是
源: Reader
目的: Writer
3、明确具体设备
源:控制台 System.in
目的:硬盘 File
InputStream in=System.in;
FileWriter fw=new FileWriter("b.txt");
需要将读取的字节数据转成字符串,在由字符流操作,麻烦
4、明确是否需要额外功能:需要,转换,高效
将字节流转成字符流。因为第二步明确的流是Reader,字符流操作文本数据更便捷;所以将已有的字节流转为字符流,InpuStreamReader
InputStreamReader isr=new InputStreamReader(System.in);
FileWriter fw=new FileWriter("b.txt");
还可以添加高效功能:
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw=new BufferedWriter(new FileWriter("b.txt"));
需求三:将一个文本文件数据显示在控制台上;
1、明确源和目的:
源: Reader InputStream
目的: Writer OutputStream
2、明确是否纯文本数据:是
源: Reader
目的: Writer
3、明确具体设备:
源: 硬盘 File
目的: 控制台 System.out
FileReader fr=new FileReader("a.txt");
OutputStream out=System.out;
4、明确是否需要额外功能:转换,高效
转换:
FileReader fr=new FileReader("a.txt");
OutputStreamWriter osw=new OutputStreamWriter(System.out);
高效:
BufferedReader bufr=new BufferedReader(new FileReader("a.txt"));
BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(System.ou));
需求四:读取键盘录入信息,显示在控制台上;
1、明确源和目的
源: Reader InputStream
目的: Writer OutputStream
2、明确数据是否纯文本:是
源: Reader
目的: Writer
3、明确具体设备
源: 键盘 System.in
目的:控制台 System.out
InputStream in=System.in;
OutputStream out=System.out;
4、明确是否需要额外功能:
需要转换,因为都是字节流,但是操作的都是文本数据
InputStreamReader isr=new InputStreamReader(System.in);
OutputStreamWriter osw=new OutputStreamWriter(System.out);
高效:
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(System.out));
需求五:将一个中文字符串数据按照指定的编码表写入到一个文本文件中;
1、明确源和目的
目的: Writer OutputStream
2、明确数据是否纯文本
是: Writer
3、明确设备
设备:硬盘 File
因为指定编码表,所以不能使用 FileWriter ,因为 FileWriter 内部使用的是默认的本地编码表;
只能使用其父类 OutputStreamWriter,OutputStreamWriter操作一个字节输出流对象,既然是操作文件,那么该对象就是FileOutStream;
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("a.txt"),charsetName);
4、明确额外功能
高效:
BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("a.txt"),charsetName));
关于转换流的使用时机:
1、源或者目的的对应设备是字节流,但是操作的却是文本数据,可以使用转换作为桥梁,提高文本操作的便携;
2、一旦操作文本涉及到具体的编码表的时候,必须使用转换流;
|