- Copy a directory with files and subdirectories in Java
- 2. Copy directory using Java 7
- 3. Copy directory using java.io API (recursion)
- 4. Copy directory using Apache Commons IO library
- 5. Conclusion
- Copying a File or Directory
- Копирование каталога на Java
- 2. Использование API java.nio
- 3. Использование java.io API
- 4. Использование Apache Commons IO
- 5. Заключение
- Читайте ещё по теме:
- Кофе-брейк #99. Как копировать файлы из одного каталога в другой на Java. Строки в Java
- Как копировать файлы из одного каталога в другой на Java
- 1. Копирование файлов из одного каталога в другой до Java 7
- Зависимость: Apache Commons IO
- 2. Копирование файлов из одного каталога в другой с помощью Java 7 NIO 2 API.
- Строки в Java
- Как создать строковый объект, используя новое ключевое слово и литералы
- Пример строки
Copy a directory with files and subdirectories in Java
In this article, we will present how to copy a directory in Java with all files and subdirectories. We are going to use plain Java and external library Apache Commons IO.
2. Copy directory using Java 7
Let’s start with the approach available in plain Java using IO libraries.
Java from version 7 provided Paths and many useful features to manipulate files and directories.
package com.frontbackend.java.io.copy; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class CopyDirectoryUsingWalk < public static void main(String[] args) throws IOException < final Path fromPath = Paths.get("/tmp/from"); Files.walk(fromPath) .forEach(source ->copySourceToDest(fromPath, source)); > private static void copySourceToDest(Path fromPath, Path source) < Path destination = Paths.get("/tmp/to", source.toString() .substring(fromPath.toString() .length())); try < Files.copy(source, destination); >catch (IOException e) < e.printStackTrace(); >> >
In this example, we used the Files.walk(. ) method available in java.nio package. We walked through the file tree starting from the root — source directory. Then we used Files.copy(. ) to copy files and directories that we found on the way.
Assume we have the following folder structure:
├── from │ ├── dir │ │ └── third │ ├── first │ └── second
After running our first example code the new directory will appear in /tmp directory with the following files and subdirectories:
└── to ├── dir │ └── third ├── first └── second
3. Copy directory using java.io API (recursion)
In older java.io API we don’t have a dedicated method to walk through a directory tree, so we need to use recursion to list files with directories and subdirectories.
Let’s check out this approach:
package com.frontbackend.java.io.copy; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class CopyDirectoryUsingRecursion < public static void main(String[] args) throws IOException < File sourceDir = new File("/tmp/from"); File destDir = new File("/tmp/to"); copyDirectory(sourceDir, destDir); >private static void copyDirectory(File sourceDir, File destDir) throws IOException < if (!destDir.exists()) < destDir.mkdir(); >for (String f : sourceDir.list()) < File source = new File(sourceDir, f); File destination = new File(destDir, f); if (source.isDirectory()) < copyDirectory(source, destination); >else < copyFile(source, destination); >> > private static void copyFile(File sourceFile, File destinationFile) throws IOException < FileInputStream input = new FileInputStream(sourceFile); FileOutputStream output = new FileOutputStream(destinationFile); byte[] buf = new byte[1024]; int bytesRead; while ((bytesRead = input.read(buf)) >0) < output.write(buf, 0, bytesRead); >input.close(); output.close(); > >
In this example, we implemented two methods: copyDirectory and copyFile . The first method will be called recursively for every folder we found in the tree. We started with the root source and destination folders and run copyDirectory(sourceDir, destDir) method.
In copyDirectory(. ) method we list all resources and check is it a file or directory. If the resource is a directory we called again copyDirectory(. ) method. In case we found a file we use copyFile(. ) to copy file from one path to another.
4. Copy directory using Apache Commons IO library
The Apache Commons IO library comes with many utility classes and methods for manipulating files.
In the following example we used FileUtils class that provide methods for reading, writing, and copying files:
package com.frontbackend.java.io.copy; import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; public class CopyDirectoryUsingFileUtils < public static void main(String[] args) throws IOException < File sourceDirectory = new File("/tmp/from"); File destinationDirectory = new File("/tmp/to"); FileUtils.copyDirectory(sourceDirectory, destinationDirectory); >>
This approach allows us to create a single-line solution.
5. Conclusion
This article presented how to copy a directory with files and subdirectories in Java. We used plain Java methods available in java.io and newer java.nio API and one of the third-party libraries for manipulating files: Apache Commons IO .
Example snippets used in this tutorial are available over on GitHub.
More Java I/O related articles are available here.
Copying a File or Directory
You can copy a file or directory by using the copy(Path, Path, CopyOption. ) method. The copy fails if the target file exists, unless the REPLACE_EXISTING option is specified.
Directories can be copied. However, files inside the directory are not copied, so the new directory is empty even when the original directory contains files.
When copying a symbolic link, the target of the link is copied. If you want to copy the link itself, and not the contents of the link, specify either the NOFOLLOW_LINKS or REPLACE_EXISTING option.
This method takes a varargs argument. The following StandardCopyOption and LinkOption enums are supported:
- REPLACE_EXISTING – Performs the copy even when the target file already exists. If the target is a symbolic link, the link itself is copied (and not the target of the link). If the target is a non-empty directory, the copy fails with the DirectoryNotEmptyException exception.
- COPY_ATTRIBUTES – Copies the file attributes associated with the file to the target file. The exact file attributes supported are file system and platform dependent, but last-modified-time is supported across platforms and is copied to the target file.
- NOFOLLOW_LINKS – Indicates that symbolic links should not be followed. If the file to be copied is a symbolic link, the link is copied (and not the target of the link).
If you are not familiar with enums , see Enum Types.
The following shows how to use the copy method:
import static java.nio.file.StandardCopyOption.*; . Files.copy(source, target, REPLACE_EXISTING);
In addition to file copy, the Files class also defines methods that may be used to copy between a file and a stream. The copy(InputStream, Path, CopyOptions. ) method may be used to copy all bytes from an input stream to a file. The copy(Path, OutputStream) method may be used to copy all bytes from a file to an output stream.
The Copy example uses the copy and Files.walkFileTree methods to support a recursive copy. See Walking the File Tree for more information.
Копирование каталога на Java
В этом коротком учебнике мы увидим, как скопировать каталог на 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 файл:
Наконец, давайте скопировать каталог с помощью этого подхода:
public static void copyDirectory(String sourceDirectoryLocation, String destinationDirectoryLocation) throws IOException
Как показано в предыдущем примере, Apache Commons IO делает все это намного проще, так как нам нужно только позвонить FileUtils.copyПрямая () метод .
5. Заключение
Эта статья проиллюстрировала, как скопировать каталог на Java. Полные образцы кода доступны более на GitHub .
Читайте ещё по теме:
Кофе-брейк #99. Как копировать файлы из одного каталога в другой на Java. Строки в Java
Как копировать файлы из одного каталога в другой на Java
Источник: DZone Я давно занимаюсь программированием на Java, и вы не поверите, но до Java 7 в Java API не было метода копирования файлов. У нас были только такие варианты: написать это самостоятельно, используя FileInputStream, FileOutputStream и буфер для копирования байтов из одного в другой; или, что еще лучше, использовать метод FileChannel.transferTo() или Apache Commons FileUtils, которые были спасением в те дни и все еще существуют сегодня. JDK сейчас эволюционировал, и уже есть достойный API для копирования файлов из одного каталога в другой. В этой статье я покажу вам, как мы копировали файлы из одного каталога в другой до Java 7, а также современный способ, который значительно упрощает эту задачу.
1. Копирование файлов из одного каталога в другой до Java 7
Зависимость: Apache Commons IO
1.1 FileUtils.copyFile (источник файла, место назначения файла) Этот метод копирует файл в новое место с сохранением отметки времени файла. Он также копирует содержимое указанного исходного файла в указанный конечный файл. Каталог, содержащий целевой файл, создается, если он не существует. Если целевой файл существует, то этот метод перезапишет его.
import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; /** * Java program to copy a file from one directory to another e.g. from src to dest * * @author Javin */ public class FileCopyDemo < public static void main(String args[]) < // Using Apache Commons FileUtils class File srcFile = new File("bin/HelloWorld.class"); File destFile = new File("target/HelloWorld.class"); try < FileUtils.copyFile(srcFile, destFile); System.out.println("File successfully copied in Java"); >catch (IOException e) < e.printStackTrace(); >> > Output: System.out.println("File successfully copied in Java");
1.2 Копирование файла в каталог с сохранением отметки времени Этот метод копирует содержимое указанного исходного файла в файл с тем же именем в указанном целевом каталоге. Целевой каталог создается, если он не существует. Если целевой файл существует, этот метод перезапишет его.
import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; /** * Java program to copy a file from one directory to another like from src to dest * * @author Javin Paul */ public class Testing < public static void main(String args[]) < // Using Apache Commons FileUtils class File srcFile = new File("bin/HelloWorld.class"); File destDir = new File("target"); try < FileUtils.copyFileToDirectory(srcFile, destDir); System.out.println("File successfully copied to destination directory in Java"); >catch (IOException e) < e.printStackTrace(); >> > Output File successfully copied to destination directory in Java
2. Копирование файлов из одного каталога в другой с помощью Java 7 NIO 2 API.
В Java 7 есть стандартный метод копирования файлов: Files.copy . Он интегрируется с собственным вводом-выводом O / S для обеспечения высокой производительности.
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import static java.nio.file.StandardCopyOption.*; import static java.nio.file.LinkOption.*; /** * Java program to copy file using Java 7 Files.copy() method * * @author Javin Paul */ public class FileCopyDemo < public static void main(String args[]) < try < Path bytes = Files.copy( new Java.io.File("bin/HelloWorld.class").toPath(), new java.io.File("target/HelloWorld.class").toPath(), REPLACE_EXISTING, COPY_ATTRIBUTES, NOFOLLOW_LINKS); System.out.println("File successfully copied using Java 7 way"); >catch (IOException e) < // TODO Auto-generated catch block e.printStackTrace(); >> >
Вы также можете копировать файлы на Java, написав код с использованием FileInputStream и FileOuputStream, но это не обязательно, если у вас установлена Java 7. В качестве альтернативы также удобен класс Apache Commons IO FileUtils. Для высокоскоростного копирования и передачи файлов вы также можете воспользоваться преимуществами классов java.nio и FileChannel, но имейте в виду, что в Windows есть ошибка, которая не позволяет вам передавать более 64 ГБ данных канала.
Строки в Java
Источник: Dev.to Как и в других языках программирования, String в Java представляет собой последовательность символов. Но Java не реализует строку как массив символов, а рассматривает ее как полный объект типа String .
Как создать строковый объект, используя новое ключевое слово и литералы
Есть два способа создания строкового объекта: с помощью ключевого слова new или с помощью литералов. Буквальное представление означает представление его значения в виде целого числа или строки. В приведенном ниже коде показано, как мы можем создать строку с помощью нового ключевого слова.
Как мы знаем, ключевое слово new используется для создания экземпляра этого класса. Выше мы создали экземпляр “a” строки типа без символов. Чтобы создать строку со значением в ней, вы можете сделать это следующим образом.
char name[] = String a = new String(chars);
Выше мы создали символьный массив name [ ] со значениями “x”, “y”, “z”, а затем присвоили этот полный массив строке “a”. Мы использовали конструктор класса String для инициализации значения строки. Как мы видели выше, создание строки с использованием ключевого слова new немного путает и занимает много времени. Но есть действительно простой способ, и именно здесь литералы приходят нам на помощь.
Вот как мы создаем строку в Java с помощью литералов. Для каждого строкового литерала в программе Java автоматически создает объект String с предоставленным ему начальным значением. Вы можете использовать строковый литерал в любом месте программы, чтобы создать из него строковый объект.