Копирайте директория в Java

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. Характеристики на файла :

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 :

 commons-io commons-io 2.7 

И накрая, нека копираме директория, използвайки този подход:

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.