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);
}
}
另外,让我们看看如何使用FileInputStream和FileOutputStream复制文件:
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
即可立即永久解锁本站全部文章
