黑马程序员技术交流社区

标题: IO流总结 [打印本页]

作者: 守株人    时间: 2015-6-9 21:49
标题: IO流总结
1:IO流
        (1)分类
                字节流:
                        输入流:
                                InputStream
                                        int read()
                                        int read(byte[] bys)
                                FileInputStream
                                BufferedInputStream
                        输出流:
                                OutputStream
                                        write(int by)
                                        write(byte[] bys,int index,int len)
                                FileOutputStream
                                BufferedOutputStream

                字符流:
                        输入流:
                                Reader
                                        int read()
                                        int read(char[] chs)
                                FileReader
                                BufferedReader
                                        String readLine()
                        输出流:
                                Writer
                                        write(int ch)
                                        write(char[] chs,int index,int len)
                                FileWriter
                                BufferedWriter
                                        write(String line)
                                        void newLine()
        (2)到底使用谁?
                如果能用记事本打开,不出现乱码,就优先使用字符流;否则用字节流。
                确定上面的情况以后,一般都是用高效流(BufferedXxxx)

               
        (3)复制文本文件:
                9种方式:
                        字节流:
                                4种
                                        基本流每次操作一个字节
                                        基本流每次操作一个字节数组
                                        高效流每次操作一个字节
                                        高效流每次操作一个字节数组(★)
                        字符流:
                                5种
                                        基本流每次操作一个字符
                                        基本流每次操作一个字符数组
                                        高效流每次操作一个字符
                                        高效流每次操作一个字符数组(★)
                                        高效流每次操作一行文本(★)

                思路:
                        1. 创建缓冲字符输入流对象(建立于文件系统中文件的对应关系)
                        2. 创建缓冲字符输出流对象(建立于文件系统中文件的对应关系)
                        3. 使用输入流对象的read方法,读出源文件中内容(显示/其他操作)
                        4. 使用输出流对象的write方法,写入数据到目的地文件(需要刷新)
                        5. 关闭流,释放资源

                怎么选择使用?
                       

                代码体现:
                        数据源:a.txt
                        目的地:b.txt

                思路:
                        1. 创建缓冲字符输入流对象(建立于文件系统中文件的对应关系)
                        2. 创建缓冲字符输出流对象(建立于文件系统中文件的对应关系)
                        3. 使用输入流对象的read方法,读出源文件中内容(显示/其他操作)
                        4. 使用输出流对象的write方法,写入数据到目的地文件(需要刷新)
                        5. 关闭流,释放资源
                代码体现:
                        //创建对象
                        BufferedReader br = null;
                        BufferedWriter bw = null;
                        try{
                                //实例化对象
                                br = new BufferedReader(new FileReader("a.txt"));
                                bw = new BufferedWriter(new FileWriter("b.txt"));

                                //读取内容
                                String len = null;
                                while((len = br.readLine())!= null){
                                        //写入数据
                                        bw.write(len);
                                        bw.newLine();
                                        bw.flush();
                                }
                        }catch(Exception e){
                                e.printStackTrace();
                        }finally{
                                if(br != null){
                                        try{
                                                br.close();
                                        }catch(Exception e){
                                                e.printStackTrace();
                                        }
                                }
                                if(bw !=  null){
                                        try{
                                                bw.close();
                                        }catch(Exception e){
                                                e.printStackTrace();
                                        }
                                }

                        }

                       

        (4)复制二进制流数据:(图片,视频,音频等)
                字节流:
                                4种
                                基本流每次操作一个字节
                                基本流每次操作一个字节数组
                                高效流每次操作一个字节
                                高效流每次操作一个字节数组(★)
               
               

                怎么选择使用?
                        选用高效流每次操作一个字节数组

                代码体现:
                        数据源:c:\\a.jpg
                        目的地:d:\\b.jpg

                思路:
                        1. 创建缓冲字节输入流对象(建立于文件系统中文件的对应关系)
                        2. 创建缓冲字节输出流对象(建立于文件系统中文件的对应关系)
                        3. 使用输入流对象的read方法,读出源文件中内容(显示/其他操作)
                        4. 使用输出流对象的write方法,写入数据到目的地文件(需要刷新)
                        5. 关闭流,释放资源
               
                //创建对象
                BufferedInputStream bis = null;
                BufferedOutputStream bos = null;
                try{
                        //实例化对象
                        bis = new BufferedInputStream(new FileInputStream("c:\\a.jpg"));
                        bos = new BufferedOutputStream(new FileOutputStream("d:\\b.jpg"));
                       
                        //读取
                        byte[] bys = new byte[1024];
                        int len = 0;
                        while((len = bis.read(bys))!= -1){
                                //写入数据
                                bos.write(bys,0,len);
                        }       
                }catch(IOException e){
                        e.printStackTrace();                       
                }fianlly{
                        if(bis != null){
                                try{
                                        bis.close();
                                }catch(Exception e){
                                        e.printStackTrace();
                                }
                        }
                        if(bos !=  null){
                                try{
                                        bos.close();
                                }catch(Exception e){
                                        e.printStackTrace();
                                }
                        }
               
                }
2:转换流(理解)
        (1)如果有字节流对象,为了使用字符流的功能,就必须使用转换流进行操作。
        (2)案例:
                键盘录入数据

                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                BufferddWriter bw = new BufferedWriter(new FileWriter("a.txt"));

                String line = null
                while((line=br.readLine())!=null)
                {
                        if("over".equals(line))
                        {
                                break;
                        }

                        bw.write(line);
                        bw.newLine();
                        bw.flush();
                }

                bw.close();
                br.close();

                把文本文件的数据通过流对象在控制台显示

                BufferedReader br = new BufferedReader(new FileReader("a.txt"));
                BufferddWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

                String line = null
                while((line=br.readLine())!=null)
                {
                        bw.write(line);
                        bw.newLine();
                        bw.flush();
                }

                bw.close();
                br.close();

3:打印流(掌握)
        (1)打印流是写数据的。
        (2)特点:
                A:可以写任意数据类型的数据
                B:如果启动了自动刷新,能自动刷新,还会换行。println()
                C:可以直接往文件写数据
                        注意:哪些流对象可以直接读写文件?
                        看构造方法,如果同时有String和File的构造参数,那么该流对象就可以读写文件。
        (3)用打印流改进复制文本文件的操作
                数据源:
                        c:\\a.txt
                目的地:
                        d:\\b.txt

                BufferedReader br = new BufferedReader(new FileReader("c:\\a.txt"));
                PrintWriter pw = new PrintWriter(new FileWriter("d:\\b.txt"),true);

                String line = null;
                while((line=br.readLine())!=null)
                {
                        pw.println(line);
                }

                pw.close();
                br.close();

4:序列化流(理解)
        (1)序列化:把对象按照流一样的方式在网络中传输,或者存储到文本文件
           反序列化:把流数据还原成对象
        (2)如何实现序列化?
                A:被序列化的对象所属的类必须实现序列化接口
                B:用序列化流对象进行操作
        (3)序列化(对象)流对象
                ObjectInputStream:
                        Object readObject()
                ObjectOutputStream:
                        void writeObject(Object obj)
        (4)掌握:
                A:看到类实现了序列化接口,就知道该类可以被序列化流对象操作
                B:看到类实现了序列化接口,知道点击鼠标就可以解决黄色警告问题
5:字符编码(理解)
        (1)编码表:
                就是字符和对应的数据组成的一张表。
        (2)常见的编码表:
                ASCII
                ISO-8859-1
                GBK
                GB2310
                GB18030
                UTF-8
                BIG5        --        自己问问度娘
        (3)转换流中的编码问题
                A:字符流 = 字节流+编码表
                B:通过转换流写入数据,指定为UTF-8编码,并通过UTF-8编码读取。
6:Properties(理解)
        (1)是Map体系一个集合类。
        (2)特点:
                A:可以把集合中的数据保存到文本文件,也可以把文本文件的数据加载到集合中。
                B:该集合的键和值都是String类型
        (3)特殊功能:
                A:setProperty(String key,String value)
                B:getProperty(String key)
                  getProperty(String key,String defaultValue)
                C:Set<String> stringPropertyNames()
        (4)和IO流结合的方法:
                A:list 通过打印流把数据保存到文件中
                B:load 通过任意流把文本中的数据加载到集合中
                C:store 通过任意流把数据保存到文件中
        (5)案例:
                查找文件中是否有键为lisi的,如果有,则修改其值为50

作者: liya7907    时间: 2015-6-9 21:54
楼主用心了,学习了。
作者: Tangtang    时间: 2015-6-9 22:00
总结的挺详细的,Io流我每次写的时候都要想半天才能确定要用到那种流
作者: fecuznmn    时间: 2015-6-9 22:07
学习了 赞一个




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