Java笔记(16)-缓冲流(高效复制文件)

缓冲流,提高了读写的性能;当然无论如何,必须使用的就是节点流; 如果说单纯使用节点流,我试了一下,复制一个简单的文件,节点流耗时如果是 150左右,而缓冲流耗时大概只有50到60多,基本上缓冲流是节点流的速度的三倍;

1.字节流缓冲复制( BufferedInputStream和BufferedOutputStream)

这个缓冲流的基本用法和之前的字节流差不多,可以理解为不过是在字节流中加了层壳,同样的也增加了数据读取的速度;可以这样理解,就是字节流他就是按规定的字节传输,有时可能很小就开始传输了,但是缓冲流则是必须要那么多字节才会传输一次,比如:搬家,每次搬一点东西,每次都要来回走(这就像是读取硬盘信息),但是一次性多搬一点(节省了来回走动,也就是多次读取的时间),东西愈多,自然愈慢;

public class TestBufferIn {
    public static void main(String[] args) {
        InputStream in = null;
        OutputStream out = null;
        BufferedOutputStream bufferedOutputStream = null;
        BufferedInputStream bufferedInputStream = null;
        try {
            in = new FileInputStream("E:\\IDEA数据\\NOweb\\FIDEA\\FileText\\src\\TextDecurate.java");
            out = new FileOutputStream("copy.txt");
            bufferedInputStream = new BufferedInputStream(in);
            bufferedOutputStream = new BufferedOutputStream(out);
            int lenth = -1;
            byte[] arr = new byte[1024];
            while ((lenth = bufferedInputStream.read(arr)) != -1) {
                bufferedOutputStream.write(arr);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                bufferedOutputStream.close();
                bufferedInputStream.close();

           /*     public void close() throws IOException {
                    byte[] buffer;
                    while ( (buffer = buf) != null) {
                        if (bufUpdater.compareAndSet(this, buffer, null)) {
                            InputStream input = in;//这里很明显是找到了输入流的节点流,
                            in = null;
                            if (input != null)
                                input.close();//在节点流中数据不为空的情况下,这里也对节点流进行关闭;
                            return;//所以归根结底,处理流的关闭,就是关闭他所对应的节点流;
                        }*/

//这后面两个其实不需要再次关闭,我们可以看看处理流close源码;如上:
//                in.close();
//                out.close();


            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

2.字符缓冲流复制(BufferReader和BufferWriter)

这个字符缓冲流,和之前的字符流复制也差不多,可以理解为在之前的字符流外面添加了一个缓冲流的壳;

public class TestBufferWR {

    public void CopyFile(FileWriter write, FileReader reader) {
        //定义一个liner用来查看是否复制完毕
        String liner = null;
        //将两个字符流放入到缓冲流中去,这里使用的是try-with-resource
        try (BufferedReader breader = new BufferedReader(reader);
             BufferedWriter bwriter = new BufferedWriter(write)) {
            //开始复制文件;
            while ((liner = breader.readLine()) != null) {
                bwriter.write(liner);
                bwriter.newLine();
            }
            bwriter.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        TestBufferWR tb = new TestBufferWR();
        try {
            //定义文件存放路径,只能是字符文件;
            FileReader reader = new FileReader("./FileText/src/TextFile.java");
            FileWriter writer = new FileWriter("CopyText.txt");
            tb.CopyFile(writer, reader);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神秘的天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值