Java I/O流 复制文件速度对比

首先来说明如何使用Java的IO流实现文件的复制:

第一步肯定是要获取文件

这里使用字节流,一会我们会对视频进行复制(视频为非文本文件,故使用之)

FileInputStream fis = new FileInputStream("copyFileName.format");// 用于读取文件

FileOutputStream fos = new FileOutputStream("generatedFileName.format"); // 用于生成文件,若文件不存在,则会新生成

第二步得到文件后就要进行复制

由第一步可知我们用的是字节流,所以我们使用byte[] 进行搬运数据

byte[] buffer = new btye[5];
int len;
// read(btye[] b)会对文件进行读取,将数据填入 b 中,并返回读取数量,如读取完毕返回 -1
while ((len = fis.read(buffer)) != -1) {
fos.write(buffer, 0, len); // 将读取的数据写入文件中
}

第三步也是最重要的一步,关闭文件

fos.close();
fis.close();

明白上述步骤后我们来看完整的代码

public void copyFile() throws IOException{ // 这里可能会抛出异常
FileInputStream fis = new FileInputStream("copyFileName.format"); // 用于读取文件
FileOutputStream fos = new FileOutputStream("generatedFileName.format"); // 用于生成文件 byte[] buffer = new byte[5];
int len;
while ((len = fis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
} fos.close();
fis.close();
}

假设我们需要运一堆沙子到工地,使用摩托车和卡车的速度是不一样,即使摩托车开的比卡车快,但是一次的载货量太少,需要不停的往返,而卡车一次能搬运不少,只需几次就可以将沙子搬完。

这里buffer就相当于运输工具,开始时定义的大小影响着拷贝文件的效率。

我们来做一个测试,检验一下:

运行一下

可以看出数组容量的增大,对于复制速度的提升是巨大。

既然如此为什么不尽可能的大呢?

是因为数组开辟是需要占用内存的,并不是越大越好。

所以我们常用1024来设定数组的大小,这样不至于复制效率太慢也不至于占用内存过多。

其实,我们还可以使用BufferedInputStreamBufferedOutputStreamFileInputStreamFileOutputStream进行包装,能够大大提升复制的效率。

实现方法与类似

运行一下

可以用BufferedInputStreamBufferedOutputStreamFileInputStreamFileOutputStream进行包装,即使buffer的容量为5也比第一测试时,用1024复制的要快。

Java I/O流 复制文件速度对比的更多相关文章

  1. java通过IO流复制文件

    package kimoji; import java.io.*; public class FileTest { public static void main(String[] args) thr ...

  2. Java IO流之【缓冲流和文件流复制文件对比】

    与文件流相比,缓冲流复制文件更快 代码: package Homework; import java.io.BufferedOutputStream; import java.io.File; imp ...

  3. JAVA通过I/O流复制文件

    JAVA通过I/O流复制文件 本文是对字节流操作,可以多音频视频文件进行操作,亲测有效. 个人感觉这个东西就是靠记的, 没什么好解释的,,,, import java.io.File; import ...

  4. Java基础小知识1——分别使用字节流和字符流复制文件

    在日常使用计算机过程中经常会涉及文件的复制,今天我们就从Java代码的角度,看看在Java程序中文件复制的过程是如何实现的. 1.使用字节流缓冲区复制文件 示例代码如下: import java.io ...

  5. Java中字节流和字符流复制文件

    字节流和字符流复制文件的过程: 1.建立两个流对象 绑定数据源和目的地 2.遍历出需复制的文件写入复制过后的新文件中(只不过是遍历的时候是区分字节和字符的) 3.访问结束后关闭资源 字节流复制文件: ...

  6. Java分享笔记:使用缓冲流复制文件

    [1] 程序设计 /*------------------------------- 1.缓冲流是一种处理流,用来加快节点流对文件操作的速度 2.BufferedInputStream:输入缓冲流 3 ...

  7. java基础IO流 复制键盘录入的目录,复制其中的.java文件到指定目录,指定目录中有重名,则改名 对加密文件计算字母个数

    package com.swift.jinji; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; im ...

  8. java核心技术之流与文件

    InputStream和OutputStream构成了输入/输出类层次结构的基础.用于按字节进行读写.而与之处在同一等级的Reader/Writer同样作为抽象类定义了用于对字符进行读取的类层次结构, ...

  9. Java之字节流操作-复制文件

    package test_demo.fileoper; import java.io.FileInputStream; import java.io.FileOutputStream; import ...

随机推荐

  1. LeetCode 646 最长数对链详解

    题目描述 给出 n 个数对. 在每一个数对中,第一个数字总是比第二个数字小. 现在,我们定义一种跟随关系,当且仅当 b < c 时,数对(c, d) 才可以跟在 (a, b) 后面.我们用这种形 ...

  2. golang 数据类型/基础语法

    常量 变量 复合类型 结构体 数组 基础类型 整型 浮点型 复数 bool 值 字符型 字符串 错误(稍微有异议) 引用类型 切片 指针 字典 管道 函数 接口 其他语法结构 包 流程控制 运算符 注 ...

  3. Kafka 为什么快

    Kafka 为什么能那么快 | Kafka高效读写数据的原因 无论 kafka 作为 MQ 也好,作为存储层也罢,无非就是两个功能(好简单的样子),一是 Producer 生产的数据存到 broker ...

  4. 串口线接Linux设备U盘安装系统和直接安装设备接显示屏2种方式不同

    Firmware Bug]: TSC_DEADLINE disabled due to Errata; please update microcode to version: 0x22 (or lat ...

  5. Golang gRPC学习(04): Deadlines超时限制

    为什么要使用Deadlines 当我们使用gRPC时,gRPC库关系的是连接,序列化,反序列化和超时执行.Deadlines 允许gRPC客户端设置自己等待多长时间来完成rpc操作,直到出现这个错误 ...

  6. java自动拆装箱

    介绍 Java 5增加了自动装箱与自动拆箱机制,方便基本类型与包装类型的相互转换操作.(关于基本类型与包装类型之前有记录过https://www.cnblogs.com/xiuzhublog/p/12 ...

  7. 关于“类.class”和“类.this”

    今天在浏览知乎的时候,看到了这个问题,感觉很多人说的不清楚.问题链接:Java 类名.class与类名.this 的区别? 话说它有什么区别呢?从API层面上来说,"类.class" ...

  8. Linux高频操作

    常用linux命令 查看文件.文件夹大小 du -hs <file/dir> 同时输出到控制台和文件 ./<program> 2>&1 | tee <log ...

  9. 团队作业4:第一篇Scrum冲刺博客(歪瑞古德小队)

    目录 一.Alpha阶段任务认领 二.明日任务安排 三.项目预期任务量 四.敏捷开发前的感想 五.团队期望 Author:歪瑞古德小队 Project:海岛漂流 集合贴:团队作业4:项目冲刺集合贴(歪 ...

  10. 从开源协议到谷歌禁用华为、Docker实体清单事件

    ​平时我们在日常开发生活都在大量和开源软件打着交道,例如安卓.Linux.Github.Docker等,而其中开源协议比如MIT.Apache也是耳熟能详,但是真正对开源协议的了解相信对大部分人来说都 ...