Перейти к основному содержимому

Скопируйте каталог в Java

· 3 мин. чтения

1. Введение

В этом кратком руководстве мы увидим, как скопировать каталог в Java, включая все его файлы и подкаталоги. Этого можно достичь с помощью основных функций Java или сторонних библиотек.

2. Использование API java.nio

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. Использование API java.io

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. Полные примеры кода доступны на GitHub .