Java 实现文件复制及文件夹复制

2023-11-15

在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() 或者使用缓冲区的方式复制
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 实现文件复制及文件夹复制 的相关文章

随机推荐

  • Hibernate学习笔记 开始学习

    Hibernate简介 Hibernate是一个优秀的对象关系映射 ORM 框架 如果你有使用纯JDBC写过一个类似博客之类的小程序的话 就知道编写JDBC语句以及转化结果集为Java对象是一件非常繁复的事情 利用Hibernate这样的O
  • 基于神经网络实现手写数字识别(matlab)

    实验目的 在matlab平台上 采用神经网络实现手写数字识别 在实验过程中 1 初步探讨数据集预处理的作用 2 增加对神经网络的理解 探讨隐含层层数 节点数和训练步长对识别成功率的影响 找到较佳的参数 3 应用交叉验证法评估训练模型的优劣
  • Java-基于SSM+JSP的二手手机回收管理系统

    项目背景 21世纪的今天 随着社会的不断发展与进步 人们对于信息科学化的认识 已由低层次向高层次发展 由原来的感性认识向理性认识提高 管理工作的重要性已逐渐被人们所认识 科学化的管理 使信息存储达到准确 快速 完善 并能提高工作管理效率 促
  • 关闭MFC对话框时删除自身

    1 在DLG类中添加成员函数 BOOL DeleteSelft 代码如下 class CDelSelfDlg public CDialog Construction public CDelSelfDlg CWnd pParent NULL
  • Vscode——报错解决:Import “torch“ could not be resolved

    一 原因 当前解释器环境中 没安装torch库 二 解决办法 前提 已经安装PyTorch环境 1 键盘上按快捷键 Ctrl shift P 2 输入 Python Select Interpreter 3 选择PyTorch解释器
  • active directory域服务

    active directory域服务 一 Windows 网络环境 工作组workgroup 域 二 windows域 1 集中管理 2 分域控制器和成员服务器 3 账户保存在域当中 文件名为 ntds dit 4 账户可在整个域当中登陆
  • 直播预告

    12月26日 RTSCon2021开发者沙龙将在线上举办 拍乐云Pano受邀出席 服务端专家沈伟锋将在活动中带来关于 拍乐云融合语音通话技术实践 的主题演讲 RTSCon的前身是FreeSWITCH开发者沙龙 而RTS的全称是Real Ti
  • (十三):图

    1 图的基本介绍 1 1为什么要有图 前面我们学到了线性表和树 线性表局限于直接前驱和一个直接后继结点的关系 树也只能有一个直接前驱也就是父节点 当我们需要多对多关系时候 就需要图 1 2图的举例说明 图是一种数据结构 其中结点可以具有零个
  • SpringBoot优质开源项目分享

    Spring Boot 算是目前 Java 领域最火的技术栈了 也是Java开发人员不得不掌握的技术 今天给大家整理了13个优质 Spring Boot 开源项目给大家参考 希望能够帮助到正在学习 Spring Boot 的小伙伴 小伙伴简
  • RK3568资料汇总

    文档资料 野火 https doc embedfire com products link zh latest linux ebf lubancat html 正点原子 http 47 111 11 73 docs boards arm l
  • python的判断与循环语句

    一 判断语句 1 判断 在程序中如果某些条件满足 才能做某件事情 而不满足时不允许做 这就是所谓的判断 2 if语句的使用格式 if 要判断的条件 条件成立时 要做的事情 如 判断年纪 如果 age 大于 18 输入成年 age 18 if
  • Centos7 交叉编译QT5.9.9源码 AArch64架构

    环境准备 centos7 镜像 下载地址 http mirrors aliyun com centos 7 9 2009 isos x86 64 aarch64交叉编译链 下载地址 https releases linaro org com
  • Java与代码检查与自动化测试

    Java是一种面向对象的编程语言 具有简单 快速 安全 可靠等特点 在Java编程中 代码质量的好坏直接关系到最终软件的质量 为了确保代码质量 我们需要进行代码检查和自动化测试 本文将详细介绍Java代码检查和自动化测试的概念 原则 工具及
  • 【DRAM存储器五】DRAM存储器的架构演进-part2

    个人主页 highman110 作者简介 一名硬件工程师 持续学习 不断记录 保持思考 输出干货内容 参考书籍 Memory Systems Cache DRAM Disk 目录
  • TCP的粘包问题

    TCP transport control protocol 传输控制协议 是面向连接的 面向流的 提供高可靠性服务 收发两端 客户端和服务器端 都要有一一成对的socket 因此 发送端为了将多个发往接收端的包 更有效的发到对方 使用了优
  • python pyinstaller打包参数介绍(转)

    pyinstaller相关参数 F onefile 打包一个单个文件 如果你的代码都写在一个 py文件的话 可以用这个 如果是多个 py文件就别用 D onedir 打包多个文件 在dist中生成很多依赖文件 适合以框架形式编写工具代码 我
  • 如何使用yum安装最新软件包

    分享请标明来自 https www css3 io how yum install release soft html 背景 使用yum安装软件时 会经常遇到安装的软件是老版本的 被非自己期望的release版本 这到底是怎么回事儿 得从r
  • 【2023】java通过modbus4j实现modus TCP通讯

    Modbus通信协议 主要分为三个子协议 RTU ASCII TCP Modbus RTU 传输的是字节数组 bit 通信 读写 输出 可以读写 输入 只能读 存储区 输出线圈 输入线圈 输出寄存器 输入寄存器 线圈 代表一个布尔量 最小单
  • Docker环境安装

    Docker环境安装 Docker简介 Docker工作原理 Docker的应用场景 Docker 的优点 CentOS Docker 安装与配置 Docker 安装 Docker 配置 Docker容器概念 Docker容器操作 拉取镜像
  • Java 实现文件复制及文件夹复制

    在Java中 有多种方法可以实现文件的复制 以下是几种常用的方式 使用字节流进行复制 通过FileInputStream和FileOutputStream分别创建源文件和目标文件的输入输出流 然后通过循环读取源文件内容 并将数据写入目标文件