A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵顺超 中级黑马   /  2014-8-1 09:36  /  954 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

6IO流常见需求:
****字符流:
        (1)需求1:在硬盘上创建一个文件并写入信息
                用字符写入流:FileWriter
                FileWriter fw = new FileWriter("g:\\filewriter.txt");
                fw.write("输入信息");
                fw.write("也可以写入字符数组".toCharArray());
                fw.flush();
                fw.close();
        (2)需求2:在原有文件上续写数据
                FileWriter fw = new FileWriter("g:\\filewriter.txt",true);
                fw.write("还可以续写信息");
                fw.write("也可以写入字符数组".toCharArray());
                fw.flush();
                fw.close();
        (3)需求3:读取硬盘上的文本文件,并将数据打印在控制台
                FileReader fr = new FileReader("g:\\filewriter.txt");
                **第一种读取方法:一个一个字节的读
                int ch = 0;
                ch = fr.read();
                sop((char)ch);
                fr.close();
                **第二种读取方法:利用数组来提高效率
                char[] buf = new char[1024];
                int len = 0;
                while((len = fr.read(buf))!=-1)
                {
                        sop(new String(buf,0,len));
                }
                fr.close();
        (4)需求4:拷贝文本文件
                利用缓冲区提高数据读写效率
                (无缓冲区就相当于一滴一滴的喝水,有缓冲区就相当于一杯一杯的喝水)
                BufferedReader bufr = new BufferedReader(new FileReader("g:\\filewriter.txt"));
                BufferedWriter bufw = new BufferedWriter(new FileWriter("d:\\copyfilewriter.txt"));
                String line = null;
                while((line = bufr.readLine())!=null)
                {
                        burw.write(line);
                        bufw.newLine();
                        bufw.flush();
                }
                bufr.close();
                bufw.close();
****字节流:字节流写入时没有刷新
        (1)需求1:在硬盘上创建一个文件并写入信息(字节流写入时没有刷新)
                FileOutputStream fos = new FileOutputStream("g:\\filestream.txt");
                fos.write(97);//写入一个字节,int97代表写入chara
                fos.write("也可以写入字节数组".getBytes());//通常使用此种方式写入,直观!
                fos.close();
        (2)需求2:在硬盘已有文件上续写数据(字节流写入时没有刷新)
                FileOutputStream fos = new FileOutputStream("g:\\filestream.txt",true);
                fos.write("创建字节写入流时,传进去一个true参数就可以继续写入信息".getBytes());
                fos.close();       
        (3)需求3:读取硬盘上的文件
                FileInputStream fis = new FileInputStream("g:\\filestream.txt");
                **第一种读法:一个字节一个字节的读(此种读法慢)
                int ch = 0;
                while((ch = fis.read())!=-1)
                {
                        sop((char)ch);
                }
                **第一种读法:利用字节数组读(此种读法效率有一定提高)
                byte[] buf = new byte[1024];
                int len = 0;
                while((len = fis.read())!=-1)
                {
                        sop(new String(buf,0,len));
                }
        (4)需求4:拷贝字节文件,如图片或者MP3或者电影
                **第一种拷贝:不带缓冲区(慢,还是效率问题)
                FileInputStream fis = new FileInputStream("g:\\1.mp3");
                FileOutputStream fos = new FileOutputStream("g:\\copy1.mp3");
                byte[] buf = new byte[1024];
                int len = 0;
                while((len = fis.read(buf))!=-1)
                {
                        fos.(buf,0,len);//字节流写入无需刷新
                }
                fis.close();
                fos.close();
                **第二种拷贝:带缓冲区,高效
                BufferedInputStream bufi = new BufferedInputStream(new FileInputStream("g:\\1.mp3"));
                BufferedOutputStream bufo = new BufferedOutputStream(new FileOutputStream("g:\\copy1.mp3"));
                int ch = 0;
                while((ch = bufi.read())!=-1)
                {
                        bufo.write(ch);
                }
                bufi.close();
                bufo.close();

1 个回复

倒序浏览
****转换流:
        (1)需求1:读取一个键盘录入
                InputStream in = System.in;//创建一个键盘录入流,流不关则可以一直录入
                int by1 = in.read();//一次读一个字节
                int by2 = in.read();//一次读一个字节
                sop(by1);//假设键盘录入的是abcd,则打印a
                sop(by2);//假设键盘录入的是abcd,则打印b
                in.close();       
        (2)需求2:键盘录入一行数据打印一行数据,如果录入的是over则结束录入
                InputStream in = System.in;
                StringBuilder sb = new StringBuilder();
                while(true)
                {
                        int ch = in.read();
                        if(ch=='\r')
                                continue;
                        if(ch=='\n')
                        {
                                String line = sb.toString();
                                if("over".equals(line))
                                        break;
                                sop(line.toUpperCase());//输出大写
                                sb.delete(0.sb.length());//清除上一行录入的数据

                        }
                        else
                                sb.append((char)ch);
                }
                in.close();
        (3)需求3:发现需求2中其实就是读一行的原理,故引入字节通向字符的桥梁:InputStreamReader
                为提高效率加入缓冲区:
                BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
                String line = null;
                while((line = bufr.readLine())!=null)
                {
                        if("over".equals(line))
                                break;
                        sop(line.toUpperCase());//输出大写
                }
                bufr.close();
        (4)需求4:键盘录入数据并打印到控制台
                BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
                BufferedWriter bufw = new BufferedWriter(new OntputStreamWriter(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();
        (5)需求5:将键盘录入的数据存储到硬盘文件
                则只需将(4)中的
                BufferedWriter bufw = new BufferedWriter(new OntputStreamWriter(System.out));
                改为:
                BufferedWriter bufw = new BufferedWriter(new OntputStreamWriter(new FileWriter("g:\\demo.txt")));
                即:
                BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
                BufferedWriter bufw = new BufferedWriter(new OntputStreamWriter(new FileWriter("g:\\demo.txt")));
                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();
        (6)需求6:将硬盘文件的数据打印到控制台
                则只需将(4)中的
                BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
                改为:
                BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileReader("g:\\demo.txt")));
                即:
                BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileReader("g:\\demo.txt")));
                BufferedWriter bufw = new BufferedWriter(new OntputStreamWriter(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();
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马