前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用IO流复制文件

使用IO流复制文件

作者头像
头发还在
发布2023-10-16 10:56:38
1560
发布2023-10-16 10:56:38
举报
文章被收录于专栏:桃花源

对文件的读取也是经常会遇到的操作,那么哪种方式效率更快呢,今天来做个测试。

首先能想到的就是,应该采用字节流对文件进行复制,文件可以是任何形式,如图片、视频、办公文档、压缩文件等等。

1、使用最基础的输入输出字节流

代码语言:javascript
复制
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class CopyFile {
    public static void main(String[] args) {
        //开始时间
        long startTime = System.currentTimeMillis();
        try {
            //声明将文件内容读取到内存的节点流
            FileInputStream fis = new FileInputStream("E:/Swagger.pdf");
            //声明将内存数据写入到文件的节点流
            FileOutputStream fos = new FileOutputStream("E:/Swagger_bak2.pdf");

            int read = 0;
            //按字节读取
            while ((read = fis.read()) != -1){
                //按字节写入
                fos.write(read);
            }
            //刷新缓存到文件
            fos.flush();
            fos.close();
            fis.close();
        }catch (Exception e){
            e.printStackTrace();
        }
        //结束时间
        long endTime = System.currentTimeMillis();
        //耗时
        System.out.println((endTime - startTime));
    }
}

输出: 1410 

这种方法虽然可以完成文件复制功能,但是效率低,因为每个字节读取或写入,需要调用大量的磁盘IO操作。

2、在输入输出字节流中加入缓存

代码语言:javascript
复制
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class CopyFile {
    public static void main(String[] args) {
        long startTime = System.currentTimeMillis();
        try {
            FileInputStream fis = new FileInputStream("E:/Swagger.pdf");
            FileOutputStream fos = new FileOutputStream("E:/Swagger_bak.pdf");

            //启用缓存
            byte[] buf = new byte[1024];

            int read = 0;
            //从文件中一次读取缓存中定义的字节
            while ((read = fis.read(buf)) != -1){
                //向文件中一次写入缓存中定义的字节数据
                fos.write(buf, 0, read);
            }

            fos.flush();
            fos.close();
            fis.close();
        }catch (Exception e){
            e.printStackTrace();
        }
        long endTime = System.currentTimeMillis();
        System.out.println((endTime - startTime));
    }
}

输出: 5 

加入了缓存数组后,减少了磁盘IO操作,按块对源文件数据进行读取,并批量写入,可以看到,文件复制的效率提升非常明显。

需要注意的是:缓存块的大小定义要适中,太小起不到作用,太大会占用过多内存。

3、不使用缓存,仅使用字节缓冲流拷贝文件

代码语言:javascript
复制
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class CopyFile {
    public static void main(String[] args) {
        //开始时间
        long startTime = System.currentTimeMillis();
        try {
            FileInputStream fis = new FileInputStream("E:/Swagger.pdf");
            FileOutputStream fos = new FileOutputStream("E:/Swagger_bak2.pdf");
            //声明字节缓冲输入流
            BufferedInputStream bis = new BufferedInputStream(fis);
            //声明字节缓冲输出流
            BufferedOutputStream bos = new BufferedOutputStream(fos);

            int read = 0;
            //将文件内容读取到缓冲流中
            while ((read = bis.read()) != -1){
                //将文件内容写入到字节缓冲流
                bos.write(read);
            }

            bos.flush();
            bos.close();
            bis.close();
        }catch (Exception e){
            e.printStackTrace();
        }
        //结束时间
        long endTime = System.currentTimeMillis();
        //耗时
        System.out.println((endTime - startTime));
    }
}

输出: 22

从输出的耗时来看,这种方式的效率,也明显优于单纯的使用字节节点流来实现文件的拷贝,但是相比缓存方式读取,效率还是较差。

4、字节缓冲流加缓存,实现文件复制 

代码语言:javascript
复制
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class CopyFile {
    public static void main(String[] args) {
        //开始时间
        long startTime = System.currentTimeMillis();
        try {
            FileInputStream fis = new FileInputStream("E:/Swagger.pdf");
            FileOutputStream fos = new FileOutputStream("E:/Swagger_bak2.pdf");
            //声明字节缓冲输入流
            BufferedInputStream bis = new BufferedInputStream(fis);
            //声明字节缓冲输出流
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            
            //声明缓存
            byte[] buf = new byte[1024];
            int read = 0;
            //采用缓冲流,读写缓存数据
            while ((read = bis.read(buf)) != -1){
                bos.write(buf, 0, read);
            }

            bos.flush();
            bos.close();
            bis.close();
        }catch (Exception e){
            e.printStackTrace();
        }
        //结束时间
        long endTime = System.currentTimeMillis();
        //耗时
        System.out.println((endTime - startTime));
    }
}

输出: 2

采用这种方式,同时使用的缓冲流和缓存技术,进一步提升了文件的读写效率,适当增大缓存数组,充分利用内存实现文件的极速复制。

总结:

文件复制的效率依次为:

字节流 < 缓冲流 < 缓存 < 缓冲流+缓存

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、使用最基础的输入输出字节流
  • 2、在输入输出字节流中加入缓存
  • 3、不使用缓存,仅使用字节缓冲流拷贝文件
  • 4、字节缓冲流加缓存,实现文件复制 
  • 总结:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档