Автор оригинала: Maja Joksovic.
1. Введение
В этом коротком учебнике мы увидим, как скопировать каталог на Java, включая все его файлы и поднаправления. Этого можно достичь с помощью основных java-функций или сторонних библиотек.
2. Использование API java.nio
Java НИО был доступен с Java 1.4. Java 7 представила НИО 2 что принесло много полезных функций, таких как лучшая поддержка для обработки символических ссылок, доступ к атрибутам файлов. Это также предоставило нам такие классы, как Путь , Пути , и Файлы что значительно облегчило манипуляцию файловой системой.
Давайте продемонстрируем такой подход:
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(); } }); }
В этом примере мы ходили файл дерево коренится в данном каталоге источника, используя Файлы.прогулка () и сослался Файлы.копия () для каждого файла или каталога мы нашли в каталоге источника.
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 к нашему пом.xml файл:
commons-io commons-io 2.8.0
Наконец, давайте скопировать каталог с помощью этого подхода:
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.copyПрямая () метод .
5. Заключение
Эта статья проиллюстрировала, как скопировать каталог на Java. Полные образцы кода доступны более на GitHub .