1、字节流

在 Java 中,文件的复制使用字节输入流和字节输出流实现,java.io 包有 InputStream 和 OutputStream 这两个顶层抽象类规范了读写文件所需的核心 API。

我们可以使用它们的子类 FileInputStream 和 FileOutputStream 来编写程序复制文件。

第一种方式:

使用 read() 和 write() 方法配合循环操作单字节的读取、写入

InputStream 的 read() 会尝试从文件读取一个字节,如果到了文件结尾则会返回-1

第二种方式:

使用 read(byte[]) 和 write(byte[], int, int) 方法配合字节缓冲、循环操作实现高效的读取、写入

InputStream 的 read(byte[]) 会尝试从文件读取 byte[] 长度个字节,该方法会把具体读取到的字节数返回,如果到了文件结尾则会返回 -1

OutputStream 的 write(byte[] buf, int offest, int len) 方法会把 buf 数组中从偏移量 offest 开始的 len 个字节写到输出流

2、单字节读写

 private static void copyFile(String src, String dst) throws IOException {

     // 用于计算程序运行时间
long start = System.currentTimeMillis(); // 定义输入流和输出流
FileInputStream fis = null;
FileOutputStream fos = null;
try { // 实例化输入流和输出流
fis = new FileInputStream(src);
fos = new FileOutputStream(dst); int i = fis.read(); // 循环从输入流读取字节,直到读取到-1即文件结尾
while(i != -1) {
fos.write(i); // 写出到输出流
i = fis.read();
}
} catch (IOException e) {
// 需要捕获IOException
e.printStackTrace();
throw e;
} finally {
// 在finally代码块关闭IO流
try {
if (fis != null)
fis.close();
if (fos != null)
fos.close();
} catch (IOException e) {}
} // 计算程序运行时间
long end = System.currentTimeMillis();
System.out.println(end - start);
}

3、定义缓冲高效读写

 private static void bufferedCopyFile(String src, String dst) throws IOException {

     // 用于计算程序运行时间
long start = System.currentTimeMillis(); // 定义输入流和输出流
FileInputStream fis = null;
FileOutputStream fos = null;
try { // 实例化输入流和输出流
fis = new FileInputStream(src);
fos = new FileOutputStream(dst); // 定义一个字节缓冲数组
byte[] buf = new byte[1024];
int i = fis.read(buf); // 循环从输入流尝试读取buf长度的字节存放到buf中
while(i != -1) {
fos.write(buf, 0, i); // 把buf写到输出流
i = fis.read(buf);
}
} catch (IOException e) {
// 需要捕获IOException
e.printStackTrace();
throw e;
} finally {
// 在finally代码块关闭IO流
try {
if (fis != null)
fis.close();
if (fos != null)
fos.close();
} catch (IOException e) {}
}
// 计算程序运行时间
long end = System.currentTimeMillis();
System.out.println(end - start);
}

4、程序运行

 public static void main(String[] args) {
String src = "D:\\src.bmp";
String dst = "D:\\tmp\\java\\dst.bmp"; try { // 单字节读写
copyFile(src, dst); // 定义缓冲高效读写
bufferedCopyFile(src, dst);
} catch (IOException e) {
e.printStackTrace();
}
}

输出:

21092
162

可以看到定义了缓冲区的方法要比单字节地读写效率高很多

Java字节流文件复制的更多相关文章

  1. Java实现文件复制的四种方式

    背景:有很多的Java初学者对于文件复制的操作总是搞不懂,下面我将用4中方式实现指定文件的复制. 实现方式一:使用FileInputStream/FileOutputStream字节流进行文件的复制操 ...

  2. java中文件复制的4种方式

    今天一个同事问我文件复制的问题,他一个100M的文件复制的指定目录下竟然成了1G多,吓我一跳,后来看了他的代码发现是自己通过字节流复制的,定义的字节数组很大,导致复制后目标文件非常大,其实就是空行等一 ...

  3. java多种文件复制方式以及效率比较

    1.背景 java复制文件的方式其实有很多种,可以分为 传统的字节流读写复制FileInputStream,FileOutputStream,BufferedInputStream,BufferedO ...

  4. Java 实现文件复制的不同方法

    用不同的方法实现文件的复制 1. 通道 Channel,它是一个对象,可以通过它读取和写入数据.拿NIO与原来的I/O比较,通道就像是流.是对接操作系统底层和缓冲区的桥梁. 2. 性能比较 内存映射最 ...

  5. Java字节流文件封装

     /**  * 字节流封装方法  */ import java.io.FileInputStream; import java.io.FileNotFoundException; import jav ...

  6. java实现文件复制粘贴功能

    java编程思想中讲到了IO流的思想,以前对于java基础总是不够深入,浅尝辄止,如今碰到语句插桩的时候就感到书到用时方恨少啊! 文件的复制涉及到源文件和新文件(无需手动创建),给出源文件的路径和文件 ...

  7. 【java】文件复制的简单实现

    package 文件操作; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; ...

  8. javaee字节流文件复制

    package Zy; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.Fil ...

  9. java IO 文件复制代码模型

    package com.xjtu.demo; import java.io.*; public class FileCopy { public static void main(String[] ar ...

随机推荐

  1. ICEM-R-b

    原视频下载地址:https://pan.baidu.com/s/1i4JGk8d ;密码: 4xr2

  2. hdoj - 1506 直方图中最大的矩形

    Problem Description A histogram is a polygon composed of a sequence of rectangles aligned at a commo ...

  3. CTF RCE(远程代码执行)

    目录 php代码执行 一.相关函数 1.代码注入 2.命令执行 二.命令执行的绕过 1.命令执行的分隔符 2.空格代替 3.绕过 4.命令执行的各种符号 三.命令无回显的情况 1.判断 2.利用 四. ...

  4. spring源码的设计模式

    转:https://blog.csdn.net/huyang0304/article/details/82928900 接下来我们只介绍在Spring中常用的设计模式. 1.1.简单工厂模式(Fact ...

  5. ASP.NET中httpmodules与httphandlers全解析

    https://www.cnblogs.com/zpc870921/archive/2012/03/12/2391424.html https://www.cnblogs.com/PiaoMiaoGo ...

  6. aligin-items与aligin-content的区别

    align-items 属性使用于所有的flex容器,它是用来设置每个flex元素在侧轴上的默认对齐方式 aligin-items 与align-content有相同的功能,不过不同点是它是用来让每一 ...

  7. rConfig v3.9.2 授权认证与未授权RCE (CVE-2019-16663) 、(CVE-2019-16662)

    rConfig v3.9.2 authenticated and unauthenticated RCE (CVE-2019-16663) and (CVE-2019-16662) 原文:https: ...

  8. (生鲜项目)01. Vue环境搭建

    第一步: nodejs安装 https://nodejs.org/en/download/ 说明安装成功 第二步: cnpm 由于npm需要很多的依赖包,这些包下载都很慢,所以就有了cnpm : ht ...

  9. 自动化运维工具之SaltStack简介与安装

    1.SaltStack简介 官方网址:http://www.saltstack.com官方文档:http://docs.saltstack.comGitHub:https:github.com/sal ...

  10. linux服务器通过X11实现图形化界面显示

    1 背景描述 有些LINUX服务器出于性能和效率的考虑,通常都是没有安装图形化界面的,那么图形化程序在服务器上压根儿就跑不起来,或者无法直接显示出来,这就很尴尬了!那么如何解决这个问题呢?可以基于X1 ...