在Java中复制目录

2025/04/06

1. 概述

在这个简短的教程中,我们将了解如何在Java中复制目录,包括其所有文件和子目录,这可以通过使用核心Java功能或第三方库来实现。

2. 使用java.nio API

Java NIO从Java 1.4开始可用,Java 7引入了NIO 2,它带来了很多有用的特性,比如更好地支持处理符号链接、文件属性访问。它还为我们提供了Path、Paths和Files等类,使文件系统操作变得更加容易。

让我们演示一下这种方法:

public static void copyDirectory(String sourceDirectoryLocation, String destinationDirectoryLocation) throws IOException {
    Files.walk(Paths.get(sourceDirectoryLocation))
            .forEach(source -> {
                Path destination = Paths.get(destinationDirectoryLocation, source.toString()
                        .substring(sourceDirectoryLocation.length()));
                try {
                    Files.copy(source, destination);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
}

在此示例中,我们使用Files.walk()遍历以给定源目录为根的文件树,并对在源目录中找到的每个文件或目录调用Files.copy()

3. 使用java.io API

从文件系统管理的角度来看,Java 7是一个转折点,因为它引入了许多方便的新功能。

但是,如果我们想与旧的Java版本保持兼容,我们可以使用递归和java.io.File功能复制目录

private static void copyDirectory(File sourceDirectory, File destinationDirectory) throws IOException {
    if (!destinationDirectory.exists()) {
        destinationDirectory.mkdir();
    }
    for (String f : sourceDirectory.list()) {
        copyDirectoryCompatibityMode(new File(sourceDirectory, f), new File(destinationDirectory, f));
    }
}

在本例中,我们将在目标目录中为源目录树中的每个目录创建一个目录,然后我们将调用copyDirectoryCompatibityMode()方法:

public static void copyDirectoryCompatibityMode(File source, File destination) throws IOException {
    if (source.isDirectory()) {
        copyDirectory(source, destination);
    } else {
        copyFile(source, destination);
    }
}

另外,让我们看看如何使用FileInputStreamFileOutputStream复制文件

private static void copyFile(File sourceFile, File destinationFile) throws IOException {
    try (InputStream in = new FileInputStream(sourceFile);
         OutputStream out = new FileOutputStream(destinationFile)) {
        byte[] buf = new byte[1024];
        int length;
        while ((length = in.read(buf)) > 0) {
            out.write(buf, 0, length);
        }
    }
}

4. 使用Apache Commons IO

Apache Commons IO有很多有用的功能,比如实用类、文件过滤器和文件比较器。在这里,我们将使用FileUtils,它提供简单的文件和目录操作方法,即读取、移动、复制。

让我们将commons-io添加到pom.xml文件中:

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>

最后,让我们使用这种方法复制一个目录:

public static void copyDirectory(String sourceDirectoryLocation, String destinationDirectoryLocation) throws IOException {
    File sourceDirectory = new File(sourceDirectoryLocation);
    File destinationDirectory = new File(destinationDirectoryLocation);
    FileUtils.copyDirectory(sourceDirectory, destinationDirectory);
}

如前面的示例所示,Apache Commons IO使这一切变得容易得多,因为我们只需要调用FileUtils.copyDirectory()方法

5. 总结

本文说明了如何在Java中复制目录。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章