java将指定目录下的文件复制到目标文件夹

技术介绍

1. 递归

  • 递归是一种基于函数调用自身的方法。它是一种非常常见的计算机编程技术,可以让程序员通过简单、优雅的方式来解决许多问题。
  • 简单来说,递归是在函数执行过程中调用自身的过程。当函数被调用时,它会先执行函数体内的语句,然后再调用自己,这个过程将会重复执行数次,直到达到某个条件才会终止递归调用。
  • 在编程中,递归可以使一些问题的解决方法变得清晰、简洁。比如树的遍历、图的搜索以及处理嵌套数据结构等,都可以通过递归来实现。
  • 需要注意的是,如果递归没有正确的终止条件,它将会一直调用自身,直到程序崩溃。因此,在编写递归函数时,必须要特别注意控制递归的深度。

2. File

  • Java中的File是一个类,它代表着本地文件系统中的文件或目录。 File类可以用于对文件(或目录)的创建、删除、重命名、查询和修改等操作。可以通过调用File类的方法实现这些操作。File类也提供了一些便捷的方法来获取文件的属性,如文件大小、最后修改时间、是否可读、是否可写等属性。File类的一些常见方法包括:
  • createNewFile() – 创建一个新文件。
  • delete() – 删除一个文件。
  • exists() – 检查文件是否存在。
  • isFile() – 检查文件是否是一个标准文件。
  • isDirectory() – 检查文件是否是一个目录。
  • renameTo(newName) – 重命名文件/目录。
  • 另外,File类还提供了一些静态方法,如list()、listFiles()等,用于列出指定目录下的文件和子目录。而对于文本文件的读取和写入操作,则需要使用Java流(InputStream和OutputStream)来处理。

实现

首先介绍下几个小方法

1. 获取文件名

public static String getFileSimpleName(File file){
    return  file.getName().replaceAll("[\\\\/]", "");
}

2. 获取文件的后缀

 public static String getFileType(File file) {
     String fileName = file.getName();
     int dotIndex = fileName.lastIndexOf(".");
     return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1);
}

3. 拷贝文件到目标文件夹

public static void copy(File sourceFile, String destinationFolder) throws IOException {
    String destinationFilePath = destinationFolder + "/" + getFileSimpleName(sourceFile);
    File file = new File(destinationFilePath);
    if (file.exists()){
        file.delete();
    }
    Files.copy(sourceFile.toPath(), file.toPath());
}

4.递归查询文件

public static void copyFilesRecursion(File sourceDir,String destDir,String...names) throws IOException {
     // 遍历源文件夹下的所有文件和文件夹
     for (File file : sourceDir.listFiles()) {
         if (file.isDirectory()) { // 如果是文件夹,递归调用 copyImages 函数
             copyFilesRecursion(file, destDir,names);
         } else if (isMateFile(file,names)) { // 如果是图片文件,拷贝到目标文件夹中
             copy(file,destDir);
         }
     }
 }

完整代码

import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystemException;
import java.nio.file.Files;;
import java.util.Arrays;

/**
 * @author zzxjs
 * @since 2023/06/27
 */
public class FileCopy {

    /**
     * 拷贝指定文件到目标文件夹
     * @param isRecursion 是否遍历子文件夹
     * @param source 源文件夹
     * @param target 目标文件夹
     * @param mateSuffixs 匹配的文件后缀,如果为空,只要不是文件夹都复制
     */
    public static void copyFile(boolean isRecursion,String source,String target,String...mateSuffixs) throws Exception {
        File sourceFile;
        if (!(sourceFile = file(source)).isDirectory()){
            throw new FileSystemException("source not directory");
        }
        File targetFile = file(target);
        //文件夹如果不存在则创建,存在则判断是否是目录
        if (targetFile.exists()){
            if (!targetFile.isDirectory()){
                throw new FileSystemException("target not directory");
            }
        }else{
            targetFile.mkdirs();
        }
        if (isRecursion){
            copyFilesRecursion(sourceFile,target,mateSuffixs);
        }else {
            copyFiles(sourceFile,target,mateSuffixs);
        }
    }

    /**
     * 创建一个File
     * @param path 路径
     */
    public static File file(String path){
        return new File(path);
    }

    /**
     * 递归查询文件
     * @param sourceDir 源文件
     * @param destDir 目标文件夹
     * @param names 匹配的后缀名
     */
    public static void copyFilesRecursion(File sourceDir,String destDir,String...names) throws IOException {
        // 遍历源文件夹下的所有文件和文件夹
        for (File file : sourceDir.listFiles()) {
            if (file.isDirectory()) { // 如果是文件夹,递归调用 copyImages 函数
                copyFilesRecursion(file, destDir,names);
            } else if (isMateFile(file,names)) { // 如果是图片文件,拷贝到目标文件夹中
                copy(file,destDir);
            }
        }
    }

    /**
     * 非递归查询文件
     * @param sourceDir 源文件
     * @param destDir 目标文件夹
     * @param names 匹配的后缀名
     */
    public static void copyFiles(File sourceDir,String destDir,String...names) throws IOException {
        // 遍历源文件夹下的所有文件和文件夹
        for (File file : sourceDir.listFiles()) {
            if (file.isFile() && isMateFile(sourceDir,names)) {
                copy(file,destDir);
            }
        }
    }

    /**
     * 拷贝文件到目标文件夹
     */
    public static void copy(File sourceFile, String destinationFolder) throws IOException {
        String destinationFilePath = destinationFolder + "/" + getFileSimpleName(sourceFile);
        File file = new File(destinationFilePath);
        if (file.exists()){
            file.delete();
        }
        Files.copy(sourceFile.toPath(), file.toPath());
    }

    /**
     * 判断文件名是否匹配
     * @param file 文件
     * @param names 需要匹配的后缀 png、doc、ppt
     * @return 如果没有填,则是文件就复制
     */
    public static boolean isMateFile(File file,String...names) {
        if (names == null || names.length == 0){
            return true;
        }
        return Arrays.asList(names).contains(getFileType(file).toLowerCase());
    }

    /**
     * 获取文件的后缀
     * @param file 文件  Z:\jiayi\postpartum\images\doduo.zip
     * @return zip
     */
    public static String getFileType(File file) {
        String fileName = file.getName();
        int dotIndex = fileName.lastIndexOf(".");
        return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1);
    }

    /**
     * 获取文件名
     * @param file  Z:\jiayi\postpartum\images\doduo.zip
     * @return doudou.zip
     */
    public static String getFileSimpleName(File file){
        return  file.getName().replaceAll("[\\\\/]", "");
    }
}

版权声明:本文为博主作者:泽泽泽json原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/Z_ABCDZ/article/details/131420602

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2024年1月8日
下一篇 2024年1月8日

相关推荐