9.0、Java_IO流 - 缓冲字节流、文件拷贝工具类

文章讲述了Java中的缓冲流在提高IO操作效率方面的作用,尤其是BufferedInputStream和BufferedOutputStream如何通过内部缓冲数组加速读写。在文件拷贝的示例中,强调了关闭流的顺序应从外向内,先关闭包装流再关闭节点流。代码示例展示了如何使用缓冲字节流实现文件的高效复制。
摘要由CSDN通过智能技术生成

9.0、Java_IO流 - 缓冲字节流、文件拷贝工具类

        Java 缓冲流本身不具有 IO 流的读写功能,只是在别的流(节点流或者处理流)中加上缓冲功能提高效率,就像是把别的流包装起来一样,因此缓冲流是一种处理流(包装流);

        当对文件或者其他数据源进行频繁的读写操作时,效率比较低,这时如果使用缓冲流就能够更高效的读写信息;因为缓冲流是先将数据缓存起来,然后当缓存区存满后或者手动刷新时再一次性的读取到程序或写入目的地中;

        因此缓冲流还是很重要的,我们在 IO 操作时记得加上缓冲流来提升性能;BufferedInputStream 和 BufferedOutputStream 这两个流式缓冲字节流,通过内部缓存数组来提高操作流的效率; 

        实现代码时,其实就是在 FileInputStream(节点流)外面在套一层 BufferInputStream(包装流);那么我想说的是 -> 在关闭流对象的时候,我们应该先关闭包装流,在关闭节点流;
        很好理解:在创建的时候,相当于先创建了一个节点流 [ 顺便讲一下:节点流是直接连接文件的流 ] ,然后在节点流的外面包上一层包装流;所以我们关闭流的时候肯定要先把包在外面的流先关闭 [ 我把这个操作过程想象成打开这层包装然后关闭这层包装流 ( 这样想更方便记住 ) ] ,打开然后才能拿到被包在里面的节点流吧,最后才能关闭节点流;

        缓冲字节流中 byte[ ] 数组的大小默认为 8192,也就是 2 的 13次方

public class Test {

    public static void main(String[] args) {
        FileInputStream fis = null;
        FileOutStream fos = null;
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            fis = new FileInputStream("D:/pic.jpg");
            fos = new FileOutputStream("D:/pic2.jpg");
            bis = new BufferedInputStream(fis);
            bos = new BufferedInputStream(fos);
            int tmp = 0;
            while((tmp = bis.read()) != -1) {
                bos.write(tmp);
            }
        }catch(Exception e) {
            e.printStackTrance();
        }finally {
            try {
                if(bis != null) {
                    bis.close();
                }
                if(bos != null) {
                    bos.close();
                }
                if(fis != null) {
                    fis.close();
                }
                if(fos != null) {
                    fos.close();
                }
            }catchException e() {
                e.printStackTrance();
            }
        }
    }
}

最后我们利用缓冲字节流写一个实例;

缓冲字节流实现 -> 文件拷贝工具类 ↓↓↓ 

public class CopyFileUtil {
    /**
     * 利用缓冲字节流实现 -> 文件拷贝
     * @param src 源文件 绝对路径
     * @param des 目标文件 绝对路径
     */
    public static void copyFile(String src,String des) {
        FileInputStream fis = null;
        FileOutputStream fos = null;
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try{
            fis = new FileInputStream(src);
            bis = new BufferedInputStream(fis);
            fos = new FileOutputStream(des);
            bos = new BufferedOutputStream(fos);
            int tmp = 0;
            while((tmp = bis.read()) != -1) {
                bos.write(tmp);
            }
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if(bis != null) {
                    bis.close();
                }
                if(bos != null) {
                    bos.close();
                }
                if(fis != null) {
                    fis.close();
                }
                if(fos != null) {
                    fos.close();
                }
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值