黑马程序员技术交流社区

标题: IO流对象使用规律总结 [打印本页]

作者: 一叶障目    时间: 2014-11-13 22:03
标题: IO流对象使用规律总结
本帖最后由 一叶障目 于 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、一旦操作文本涉及到具体的编码表的时候,必须使用转换流;









作者: wf111sxwf    时间: 2014-11-14 18:33
总结的好啊 学习了
作者: cczheng    时间: 2014-11-15 11:34
挺不错,和毕老师的笔记类似




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2