Java字节流文件复制

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、单字节读写

 1 private static void copyFile(String src, String dst) throws IOException {
 2
 3     // 用于计算程序运行时间
 4     long start = System.currentTimeMillis();
 5
 6     // 定义输入流和输出流
 7     FileInputStream fis = null;
 8     FileOutputStream fos = null;
 9     try {
10
11         // 实例化输入流和输出流
12         fis = new FileInputStream(src);
13         fos = new FileOutputStream(dst);
14
15         int i = fis.read();
16
17         // 循环从输入流读取字节,直到读取到-1即文件结尾
18         while(i != -1) {
19             fos.write(i); // 写出到输出流
20             i = fis.read();
21         }
22     } catch (IOException e) {
23         // 需要捕获IOException
24         e.printStackTrace();
25         throw e;
26     } finally {
27         // 在finally代码块关闭IO流
28         try {
29             if (fis != null)
30                 fis.close();
31             if (fos != null)
32                 fos.close();
33         } catch (IOException e) {}
34     }
35
36     // 计算程序运行时间
37     long end = System.currentTimeMillis();
38     System.out.println(end - start);
39 }

3、定义缓冲高效读写

 1 private static void bufferedCopyFile(String src, String dst) throws IOException {
 2
 3     // 用于计算程序运行时间
 4     long start = System.currentTimeMillis();
 5
 6     // 定义输入流和输出流
 7     FileInputStream fis = null;
 8     FileOutputStream fos = null;
 9     try {
10
11         // 实例化输入流和输出流
12         fis = new FileInputStream(src);
13         fos = new FileOutputStream(dst);
14
15         // 定义一个字节缓冲数组
16         byte[] buf = new byte[1024];
17         int i = fis.read(buf);
18
19         // 循环从输入流尝试读取buf长度的字节存放到buf中
20         while(i != -1) {
21             fos.write(buf, 0, i); // 把buf写到输出流
22             i = fis.read(buf);
23         }
24     } catch (IOException e) {
25         // 需要捕获IOException
26         e.printStackTrace();
27         throw e;
28     } finally {
29         // 在finally代码块关闭IO流
30         try {
31             if (fis != null)
32                 fis.close();
33             if (fos != null)
34                 fos.close();
35         } catch (IOException e) {}
36     }
37     // 计算程序运行时间
38     long end = System.currentTimeMillis();
39     System.out.println(end - start);
40 }

4、程序运行

 1 public static void main(String[] args) {
 2     String src = "D:\\src.bmp";
 3     String dst = "D:\\tmp\\java\\dst.bmp";
 4
 5     try {
 6
 7         // 单字节读写
 8         copyFile(src, dst);
 9
10         // 定义缓冲高效读写
11         bufferedCopyFile(src, dst);
12     } catch (IOException e) {
13         e.printStackTrace();
14     }
15 }

输出:

21092
162

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

原文地址:https://www.cnblogs.com/xugf/p/9048110.html

时间: 2024-08-29 02:07:06

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

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

背景:有很多的Java初学者对于文件复制的操作总是搞不懂,下面我将用4中方式实现指定文件的复制. 实现方式一:使用FileInputStream/FileOutputStream字节流进行文件的复制操作 1 private static void streamCopyFile(File srcFile, File desFile) throws IOException { 2 // 使用字节流进行文件复制 3 FileInputStream fi = new FileInputStream(sr

java中文件复制的4种方式

今天一个同事问我文件复制的问题,他一个100M的文件复制的指定目录下竟然成了1G多,吓我一跳,后来看了他的代码发现是自己通过字节流复制的,定义的字节数组很大,导致复制后目标文件非常大,其实就是空行等一些无效空间.我也是很少用这种方式拷贝问价,大多数用Apache提供的commons-io中的FileUtils,后来在网上查了下,发现还有其他的方式,效率更高,所以在此整理一下,也是自己的一个学习. 1. 使用FileStreams复制 比较经典的一个代码,使用FileInputStream读取文件

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

1.背景 java复制文件的方式其实有很多种,可以分为 传统的字节流读写复制FileInputStream,FileOutputStream,BufferedInputStream,BufferedOutputStream 传统的字符流读写复制FileReader,FileWriter,BufferWriter,BufferedWriter,BufferedReader NIO系列的FileChannel FileChannel+缓冲 java.nio.Files.copy() 第三方包中的Fi

JAVA之文件复制 图片下载

用java打造属于自己的爬虫 网络上的图片太多 一个一个的保存实在太浪费时间 基于此 就使用了java做了一个小工具 功能是文件的复制 以及 网络上图片的下载 首先是IOUtlis类的创建 package hh; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputS

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

用不同的方法实现文件的复制 1. 通道 Channel,它是一个对象,可以通过它读取和写入数据.拿NIO与原来的I/O比较,通道就像是流.是对接操作系统底层和缓冲区的桥梁. 2. 性能比较 内存映射最快,其次是NIO读写文件,再其次是加了缓冲的IO流,最后是无缓冲的IO流 代码示例 import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; impor

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

1 package 文件操作; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.io.OutputStream; 9 10 public class TestCopy { 11 public static voi

Java实现文件复制

import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /** * <p>CopyFile.java</p> * <p>Created on Apr 17, 2009, 4:33:43 PM</p> * <p>Copyright (c) 2007-2009. CUCKOO Workgroup, USTC, P.R.Ch

java 高效率文件复制

1 File sourFile = new File(start); //来源文件 2 File tarFile = new File(end); 4 if(!tarFile.exists()){ 5 tarFile.mkdirs(); 6 }10 if(!sourFile.exists()){ 11 System.out.println("跳出本次循环"+start); 12 continue; 13 } 16 FileInputStream fis = null; 17 FileO

java 字节流文件复制方法总结

1.使用字节流每次读写单个字节 1 public static void main(String[] args) throws IOException { 2 FileInputStream fis = new FileInputStream("C:\\CloudMusic\\1.mp3"); 3 FileOutputStream fos = new FileOutputStream("e:\\1.mp3"); 4 int len = 0; 5 while ((le