用Java实现文件复制

Hello World, Hello Java IO

Posted by Resulte on March 6, 2020

文件复制

文件复制,就是将某个文件复制一份到指定路径下。

在Java中,我们可以通过文件输入输出流实现该操作。

原理:从已有文件中读取字节,将该字节写出到另一个文件中。

下面,我以需要将C:\下的sourceFile.txt文件复制到D:\下为例,总结文件复制操作的几个步骤和实现。

文件复制的步骤

  1. 创建一个字节输入流对象,构造方法中绑定要读取的数据源(被复制文件)。
  2. 创建一个字节输出流对象,构造方法中绑定要写入的目的地。
  3. 使用字节输入流对象中的方法read读取文件。
  4. 使用字节输出流中的方法write,把读取到的字节写入目的地文件中。
  5. 释放资源。

代码实现如下:

public class FileTest {
    public static void main(String[] args) throws IOException {
        //1.创建一个字节输入流对象
        FileInputStream fis = new FileInputStream("C:\\sourceFile.txt");
        //2.创建一个字节输出流对象
        FileOutputStream fos = new FileOutputStream("D:\\sourceFile.txt");
        //data存储字节数据
        byte data = 0;
        //循环读入字节数据并输出到目标文件中
        while((data = fis.read()) != -1){
            fos.write(data);
        }
        //释放资源
        fos.close();
        fis.close();
    }
}

小贴士:

流的关闭原则:先开后关,后开先关。

当然像上面那样每次循环只读入一个字节的数据,效率会异常的底下,所以我们可以引入字节缓存数组,一次读取多个字节的数据,加快文件复制的效率。

public class FileTest {
    public static void main(String[] args) throws IOException {
        //1.创建一个字节输入流对象
        FileInputStream fis = new FileInputStream("C:\\sourceFile.txt");
        //2.创建一个字节输出流对象
        FileOutputStream fos = new FileOutputStream("D:\\sourceFile.txt");
        //字节缓存数组,一次读取1024字节的数据
        byte[] bytes = new byte[1024];
        //每次读取数据的有效长度
        int len = 0; 
        while((len = fis.read(bytes)) != -1){
            fos.write(bytes,0, len);
        }
        //释放资源
        fos.close();
        fis.close();
    }
}

当然,你还想要更快速的复制文件的话,我们还是有办法嘀。那就是使用字节缓冲输入流BufferedInputStream和 字节缓冲输出流BufferedOutputStream

步骤

  1. 创建一个字节缓冲输入流对象,构造方法中传递字节输入流。
  2. 创建一个字节缓冲输出流对象,构造方法中传递字节输出流。
  3. 使用字节缓冲输入流对象中的方法read读取文件。
  4. 使用字节缓冲输出流中的方法write,把读取到的字节写入内部缓冲区中。
  5. 释放资源(会先把缓冲区中的数据刷新到内存中)。
public class FileTest {
    public static void main(String[] args) throws IOException {
        //1.创建一个字节缓冲输入流对象
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:\\sourceFile.txt"));
        //2.创建一个字节缓冲输出流对象
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\sourceFile.txt"));
        //字节缓存数组,一次读取1024字节的数据
        byte[] bytes = new byte[1024];
        //每次读取数据的有效长度
        int len = 0; 
        while((len = bis.read(bytes)) != -1){
            bos.write(bytes,0, len);
        }
        //释放资源
        bos.close();
        bis.close();
    }
}