缓冲流

缓冲流: 是处理流的一种,主要作用是提高文件的读写效率
处理流: 套接在已有的流(不一定是节点流,处理流也可)的基础上
处理流不能直接作用在文件上
BufferedInputStream是来包装FileInputStream的,包装完以后就用这个流进行处理,以此类推

import java.io.*;

//非文本文件的复制
public class Test {
    public static void main(String[] args) {
       //快速写try的方法alt+shift+z
        FileOutputStream fos=null;
        FileInputStream fis=null;
        BufferedInputStream bis=null;
        BufferedOutputStream bos=null;
       try{
           //1.造文件
           File f1 = new File("fun.jpg");
           File f2 = new File("fun1.jpg");
           //2.造流,要先造节点流,再造缓冲流
           fis=new FileInputStream(f1);
           fos=new FileOutputStream(f2);
           bis=new BufferedInputStream(fis);
           bos=new BufferedOutputStream(fos);
           //3.复制的细节
           byte[] bytes=new byte[5];
           int len;
           while((len=bis.read(bytes))!=-1){
               bos.write(bytes,0,len);
           }
       } catch (FileNotFoundException e) {
           e.printStackTrace();
       } catch (IOException e) {
           e.printStackTrace();
       } finally{
           //4.资源关闭,注意关闭顺序的要求:先关闭外层(先关闭外层的哪一个流无所谓)的流再关闭内层的流(先关闭内层的哪一个流无所谓)
           //可以省略书写关闭内层流,当然写上一定不算错
           try {
               if(bos!=null)
               bos.close();
           } catch (IOException e) {
               e.printStackTrace();
           }
           try {
               if(bis!=null)
               bis.close();
           } catch (IOException e) {
               e.printStackTrace();
           }
           //fos.close();在关闭外层流的时候,会自动帮我们关掉内层流
           //fis.close();在关闭外层流的时候,会自动帮我们关掉内层流
       }
     }
}

缓冲流能够提高读写速度的原因: 内部提供了一个缓冲区,当读入的数据装满了缓冲区时进行一次性写出,通过这种方式提高速度
BuffreredOutputStream中有一个flush()方法,用来刷新缓冲区(把数据写出去,清空缓冲区),正常情况下读入的数据超过了缓冲区的大小就会自动flush(在write的过程中会自动flush)
直接显式调用flush是读入的数据还没有装满缓冲区就去flush

BufferedReader和BufferedWriter的用法类似,不能用来处理非文本文件

熟练之后可以这么写:

import java.io.*;

//文本文件的复制
public class Test {
    public static void main(String[] args) {
       //快速写try的方法alt+shift+z
        BufferedReader br=null;
        BufferedWriter bw=null;
        try {
            //造文件造流
            br = new BufferedReader(new FileReader(new File("hello1.txt")));
            bw = new BufferedWriter(new FileWriter(new File("fun.txt")));
            //读写操作
            //方式一,使用char型数组
            //char[] chars=new char[5];
            //int len;
            //while((len=br.read(chars))!=-1){
              //  bw.write(chars,0,len);//注意1kb=1024byte
            //}
            //方式二,利用BufferedReader多的一种处理方式,叫做readLine(),一次读一行,返回的是String,使用String
            String data;
            while((data=br.readLine())!=null){//readLine()用String返回当前这一行的数据(不包含换行符),到文件的末尾返回null
                //方法一:
                //bw.write(data+"\n");//data中不包含换行符,需要自己加换行符,否则得到的数据是一行的
                //方法二:
                bw.write(data);
                bw.newLine();//用来加换行符
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭资源
            try {
                if(br!=null)
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(bw!=null)
                bw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
     }
}

注意: 字节流可以实现文本文件的复制,相应的缓冲流如果是字节流当然也能实现,只是建议文本文件以char为单位进行处理更合适一些

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值