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 .