Як копіювати файли в Java?


Дізнайтесь більше про нові кар'єрні можливості в EchoUA. Цікаві проекти, ринкова оплата, гарний колектив. Надсилайте резюме та приєднуйтеся до нас.

У цій статті ми розглянемо типові способи копіювання файлів в Java на прикладі чотирьох бібліотек: вбудованих IO і NIO.2 API і зовнішніх Commons IO і Guava.

IO API (До JDK7)

При використанні цього вбудованого пакету для копіювання файлу необхідно відкрити файловий потік, пройтися циклом по його вмісту і записати його в результуючий потік.

@Testpublic void givenIoAPI_whenCopied_thenCopyExistsWithSameContents () throws IOException { File copied = new File("src/test/resources/copiedWithIo.txt"); try ( InputStream in = new BufferedInputStream ( new FileInputStream (original)); OutputStream out = new BufferedOutputStream ( new FileOutputStream (copied))) { byte[] buffer = new byte[1024]; int lengthRead; while ((lengthRead = in.read (buffer)) > 0) {
out.write (buffer, 0, lengthRead); out.flush (); } } assertThat (copied).exists (); assertThat (Files.readAllLines (original.toPath()) .equals (Files.readAllLines (copied.toPath())));}

Прим. перев. При такому способі права доступу (rwx) і дати створення/модифікації не копіюються.

Досить багато коду для реалізації базової функції. На щастя, Java поступово удосконалює свої вбудовані бібліотеки, і, починаючи з JDK7, можна використати простіший спосіб копіювання за допомогою NIO.2 API.

NIO.2 API (JDK7)

Ця бібліотека покращує продуктивність процедури копіювання за рахунок використання низькорівневих точок входу.

За умовчанням нові скопійовані файли не можуть переписати раніше створені. Також не можна скопіювати атрибути файлу-джерела. Але поведінка методу Files.copy () може бути змінено при використанні спеціальних опцій :

  • REPLACE_EXISTING – замінити файл, якщо він вже існував,
  • COPY_ATTRIBUTES – скопіювати метадані в новий файл,
  • NOFOLLOW_LINKS – не переходити по символічним посиланням.

Прим. перев. Якщо копійований файл – це символічне посилання, то при використанні опції NOFOLLOW_LINKS буде скопійовано саме посилання, а не файл, на який вона вказує.

Клас NIO.2 Files надає декілька переобтяжених методів copy () для копіювання файлів і директорій у файловій системі.

@Testpublic void givenNIO2_whenCopied_thenCopyExistsWithSameContents () throws IOException { Path copied = Paths.get("src/test/resources/copiedWithNio.txt"); Path originalPath = original.toPath (); Files.copy (originalPath, copied, StandardCopyOption.REPLACE_EXISTING); assertThat (copied).exists (); assertThat (Files.readAllLines (originalPath) .equals (Files.readAllLines (copied)));} 

Важливо відмітити, що копіювання директорій – поверхневе, тобто файли піддиректорій не скопіюються.

Apache Commons IO

Для роботи з бібліотекою Commons IO треба додати залежність:

 commons - io commons - io 2.6

Свіжу версію бібліотеки можна викачати з Maven Central.

Потім використовуємо метод copyFile (), визначений в класі FileUtils. Він приймає на вхід файл-джерело і файл, в який буде скопійований початковий.

@Test
public void givenCommonsIoAPI_whenCopied_thenCopyExistsWithSameContents () throws IOException { File copied = new File ( "src/test/resources/copiedWithApacheCommons.txt"); FileUtils.copyFile (original, copied); assertThat (copied).exists (); assertThat (Files.readAllLines (original.toPath()) .equals (Files.readAllLines (copied.toPath())));}

Guava

І наостанок звернемо увагу на бібліотеку Guava. Для її використання також необхідно додати залежність:

 com.google.guava guava 23.0

Останню версію бібліотеки можна знайти на Maven Central.

Приклад роботи :

@Testpublic void givenGuava_whenCopied_thenCopyExistsWithSameContents () throws IOException { File copied = new File("src/test/resources/copiedWithGuava.txt"); com.google.common.io.Files.copy (original, copied); assertThat (copied).exists (); assertThat (Files.readAllLines (original.toPath()) .equals (Files.readAllLines (copied.toPath())));}

Переклад статті “How to copy a file with Java”

Київ, Харків, Одеса, Дніпро, Запоріжжя, Кривий Ріг, Вінниця, Херсон, Черкаси, Житомир, Хмельницький, Чернівці, Рівне, Івано-Франківськ, Кременчук, Тернопіль, Луцьк, Ужгород, Кам'янець-Подільський, Стрий - за статистикою саме з цих міст програмісти найбільше переїжджають працювати до Львова. А Ви розглядаєте relocate?


Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *