Java实现文件复制及文件夹复制几种常用的方式

 更新时间:2023年09月26日 08:54:24   作者:Bridge Fish  
这篇文章主要给大家介绍了关于Java实现文件复制及文件夹复制几种常用的方式,java复制文件的方式其实有不少种,文中通过代码介绍的非常详细,需要的朋友可以参考下

在Java中,有多种方法可以实现文件的复制。以下是几种常用的方式:

使用字节流进行复制:

通过FileInputStream和FileOutputStream分别创建源文件和目标文件的输入输出流,然后通过循环读取源文件内容,并将数据写入目标文件中进行复制。

可以使用字节数组作为缓冲区,提高复制效率。

需要手动处理流的打开、关闭和异常处理。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class ByteStreamCopyExample {
    public static void main(String[] args) {
        String sourceFilePath = "source.txt";
        String destinationFilePath = "destination.txt";
        try (FileInputStream fis = new FileInputStream(sourceFilePath);
             FileOutputStream fos = new FileOutputStream(destinationFilePath)) {
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, bytesRead);
            }
            System.out.println("文件复制成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用字符流进行复制:

通过FileReader和FileWriter分别创建源文件和目标文件的字符流,然后通过循环读取源文件内容,并将数据写入目标文件中进行复制。

可以使用字符数组作为缓冲区,提高复制效率。

需要手动处理流的打开、关闭和异常处理。

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CharacterStreamCopyExample {
    public static void main(String[] args) {
        String sourceFilePath = "source.txt";
        String destinationFilePath = "destination.txt";
        try (FileReader fr = new FileReader(sourceFilePath);
             FileWriter fw = new FileWriter(destinationFilePath)) {
            char[] buffer = new char[1024];
            int charsRead;
            while ((charsRead = fr.read(buffer)) != -1) {
                fw.write(buffer, 0, charsRead);
            }
            System.out.println("文件复制成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用Files类的copy()方法:

在Java的NIO包中,提供了Files类的静态方法copy(),可以直接将一个文件复制到目标位置。

可以使用StandardCopyOption枚举类指定复制选项,例如REPLACE_EXISTING用于覆盖已存在的目标文件。

相对于字节流和字符流,使用Files.copy()方法更简洁方便。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Text6 {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("user.txt");
             FileOutputStream fos = new FileOutputStream("user1.txt")) {
            fis.transferTo(fos);
            System.out.println("文件复制成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用Files类的copy()方法结合通道进行复制:

使用FileChannel来处理源文件和目标文件的通道,通过调用源文件通道的transferTo()或transferFrom()方法,将数据从源文件传输到目标文件。

这种方式可以利用底层操作系统提供的文件复制机制,性能较高。

需要手动处理通道和流的打开、关闭和异常处理。

(transferTo(OutputStream out) 此方法是java9 新方法,直接实现复制文件。 )

import java.io.IOException;
import java.nio.channels.FileChannel;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
public class ChannelCopyExample {
    public static void main(String[] args) {
        Path sourceFilePath = Path.of("source.txt");
        Path destinationFilePath = Path.of("destination.txt");
        try (FileChannel sourceChannel = FileChannel.open(sourceFilePath);
             FileChannel destinationChannel = FileChannel.open(destinationFilePath,
                     StandardOpenOption.CREATE, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING)) {
            destinationChannel.transferFrom(sourceChannel, 0, sourceChannel.size());
            System.out.println("文件复制成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用第三方库:

Java中有一些第三方库可以简化文件复制操作,例如 Apache Commons IO 的FileUtils类提供了多个便捷的方法用于复制文件或目录。

import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
public class ApacheCommonsIOCopyExample {
    public static void main(String[] args) {
        File sourceFile = new File("source.txt");
        File destinationFile = new File("destination.txt");
        try {
            FileUtils.copyFile(sourceFile, destinationFile);
            System.out.println("文件复制成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

目录(文件夹)复制

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
public class Text7 {
    public static void main(String[] args) {
        File sourceDir = new File("D:\\A---webdate");
        File destinationDir = new File("D:\\A---webdate1");
        try {
            copyDirectory(sourceDir, destinationDir);
            System.out.println("目录复制成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
//在copyDirectory()方法中,我们首先检查目标目录是否存在,如果不存在,则创建该目录。
// 然后遍历源目录下的所有文件和子目录,根据文件类型调用copyDirectory()或copyFile()方法进行复制操作。
// 对于子目录,递归调用copyDirectory()方法;对于文件,调用copyFile()方法。
    public static void copyDirectory(File sourceDir, File destinationDir) throws IOException {
        if (!destinationDir.exists()) {
            destinationDir.mkdirs();
        }
        File[] files = sourceDir.listFiles();
        if (files != null) {
            for (File file : files) {
                File destinationFile = new File(destinationDir, file.getName());
                if (file.isDirectory()) {
                    copyDirectory(file, destinationFile);
                } else {
                    copyFile(file, destinationFile);
                }
            }
        }
    }
//在copyFile()方法中,我们使用Files.copy()方法将源文件的内容复制到目标文件中。
    public static void copyFile(File sourceFile, File destinationFile) throws IOException {
        Files.copy(sourceFile.toPath(), destinationFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
// 这里可以使用你前面提到的复制文件的方法,如 transferTo() 或者使用缓冲区的方式复制
    }
}

总结 

到此这篇关于Java实现文件复制及文件夹复制几种常用的方式的文章就介绍到这了,更多相关Java文件复制及文件夹复制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 简单了解java volatile

    简单了解java volatile

    这篇文章主要介绍了了解java volatile,volatile是Java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色。下面我们来一起学习一下吧
    2019-05-05
  • maven查看依赖树的方法实现

    maven查看依赖树的方法实现

    Maven依赖树是以当前项目的POM文件为根节点,列出了所有直接或间接依赖的依赖树结构,本文就详细的来介绍一下如何查看,感兴趣的可以了解一下
    2023-08-08
  • spring本地事务失效的原因分析

    spring本地事务失效的原因分析

    这篇文章给大家介绍了spring本地事务失效的情况原因分析,给大家罗列了五种原因分析,通过代码示例介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2023-10-10
  • 流式图表拒绝增删改查之kafka核心消费逻辑上篇

    流式图表拒绝增删改查之kafka核心消费逻辑上篇

    这篇文章主要为大家介绍了流式图表拒绝增删改查之kafka核心消费逻辑详解的上篇,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Java使用Math.random()结合蒙特卡洛方法计算pi值示例

    Java使用Math.random()结合蒙特卡洛方法计算pi值示例

    这篇文章主要介绍了Java使用Math.random()结合蒙特卡洛方法计算pi值的方法,简单说明了结合具体实例蒙特卡洛方法的原理,并结合具体实例形式分析了java使用蒙特卡洛方法计算PI值的操作技巧,需要的朋友可以参考下
    2017-09-09
  • java &与&&的区别及实例

    java &与&&的区别及实例

    这篇文章主要介绍了java &与&&的区别的相关资料,并附简单实例,帮助大家学习理解这部分知识,需要的朋友可以参考下
    2016-10-10
  • java web实现简单登录注册功能全过程(eclipse,mysql)

    java web实现简单登录注册功能全过程(eclipse,mysql)

    前期我们学习了javaweb项目用JDBC连接数据库,还有数据库的建表功能,下面这篇文章主要给大家介绍了关于java web实现简单登录注册功能的相关资料,需要的朋友可以参考下
    2022-07-07
  • Java中的Web MVC简介_动力节点Java学院整理

    Java中的Web MVC简介_动力节点Java学院整理

    MVC模型是一种架构型的模式,本身不引入新功能,只是帮助我们将开发的结构组织的更加合理,使展示与模型分离、流程控制逻辑、业务逻辑调用与展示逻辑分离
    2017-09-09
  • 详解Java中Math.round()的取整规则

    详解Java中Math.round()的取整规则

    这篇文章主要介绍了详解Java中Math.round()的取整规则,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • java 输入一个数字,反转输出这个数字的值(实现方法)

    java 输入一个数字,反转输出这个数字的值(实现方法)

    下面小编就为大家带来一篇java 输入一个数字,反转输出这个数字的值(实现方法)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10

最新评论