Как скопировать файл java

Обновлено: 07.07.2024

меня всегда беспокоило, что единственный способ скопировать файл на Java включает открытие потоков, объявление буфера, чтение в одном файле, цикл через него и запись его в другой steam. Сеть усеяна похожими, но все же немного разными реализациями этого типа решения.

есть ли лучший способ, который остается в пределах языка Java (значение не включает выполнение конкретных команд ОС)? Возможно, в каком-то надежном open source пакет утилиты, который, по крайней мере, затенит эту базовую реализацию и обеспечит однолинейное решение?

Как упоминалось выше в toolkit, Apache Commons IO-это путь, в частности пакета fileutils.copyFile (); он обрабатывает всю тяжелую работу для вас.

и в качестве постскриптума обратите внимание, что последние версии FileUtils (например, выпуск 2.0.1) добавили использование NIO для копирования файлов;NIO может значительно увеличить производительность копирования файлов, в значительной степени потому, что процедуры NIO откладывают копирование непосредственно в ОС / файловую систему чем обрабатывать его, читая и записывая байты через слой Java. Поэтому, если вы ищете производительность, возможно, стоит проверить, что вы используете последнюю версию FileUtils.

Я бы избегал использования mega api, такого как Apache commons. Это упрощенная операция и ее встроенный в JDK в новом пакете NIO. Это было уже связано с предыдущим ответом, но ключевым методом в api NIO являются новые функции "transferTo" и "transferFrom".

один из связанные статьи показывают отличный способ интеграции этой функции в ваш код с помощью transferFrom:

изучение NIO может быть немного сложным, поэтому вы можете просто доверять этому механику, прежде чем уйти и попытаться узнать NIO за одну ночь. Из личного опыта это может быть очень трудно узнать, если у вас нет опыта и были введены в IO через java.потоки ввода-вывода.

теперь с Java 7 Вы можете использовать следующий синтаксис try-with-resource:

или, еще лучше, это также может быть достигнуто с помощью нового класса файлы представлены в Java 7:

Файл копии Java

  1. Поток файлов копирования Java

Это обычный способ копирования файлов на java. Здесь мы создаем два файла – исходный и конечный. Затем мы создаем входной поток из исходного кода и записываем его в файл назначения, используя выходной поток для операции копирования файла java.

Вот метод, который можно использовать для копирования файла java с помощью потоков.

  1. Файл копии Java – java.nio.каналы.Файловый канал

Классы Java NIO были введены в Java 1.4, и канал FileChannel можно использовать для копирования файлов на java. Согласно transferFrom() методу javadoc, этот способ копирования файла должен быть быстрее, чем использование потоков для копирования файлов java.

Вот метод, который можно использовать для копирования файла с помощью FileChannel.

  1. Файл копирования Java – файлы ввода-вывода Apache Commons

Apache Commons IO Файлы . Файл копирования(файл srcFile, файл destFile) может использоваться для копирования файла на java. Если вы уже используете Apache Commons IO в своем проекте, имеет смысл использовать это для простоты кода. Внутренне он использует файловый канал Java NIO, поэтому вы можете избежать этого метода оболочки, если вы еще не используете его для других функций.

Вот метод использования apache commons io для работы с файлами копирования java.

  1. Java Копировать файл – класс файлов

Если вы работаете на Java 7 или выше, вы можете использовать Файлы класс копировать() метод для копирования файла на java. Он использует поставщиков файловых систем для копирования файлов.

Теперь, чтобы выяснить, какой метод является самым быстрым, я написал тестовый класс и выполнил описанные выше методы один за другим для копирования файла объемом 1 ГБ. В каждом вызове я использовал разные файлы, чтобы избежать каких-либо преимуществ для более поздних методов из-за кэширования.

Из выходных данных ясно, что потоковое копирование-лучший способ копирования файла на Java. Но это очень простой тест. Если вы работаете над проектом с высокой производительностью, вам следует опробовать различные методы копирования файлов java и записать время, чтобы определить наилучший подход для вашего проекта.

Вам также следует поиграться с различными способами копирования файлов java в зависимости от вашего среднего размера файла.

Я создал видео на YouTube для 4 способов копирования файла на java, вы можете посмотреть его, чтобы узнать больше.

В этой статье мы рассмотрим распространенные способы копирования файлов на Java.

Во-первых, мы будем использовать стандартные API-интерфейсы IO и NIO.2 и две внешние библиотеки: commons-io и guava.

2. IO API (до JDK7)

Прежде всего, чтобы скопировать файл с помощью java.io API, нам нужно открыть поток, просмотреть содержимое и записать его в другой поток:

Достаточно много работы для реализации такого базового функционала.

К счастью для нас, Java улучшила свои основные API, и у нас есть более простой способ копирования файлов с помощью NIO.2 API .

3. NIO.2 API (JDK7)

Использование NIO.2 может значительно повысить производительность копирования файлов, поскольку NIO.2 использует точки входа в систему более низкого уровня.

Давайте подробнее рассмотрим, как файлы. copy () работает.

Метод copy () дает нам возможность указать необязательный аргумент, представляющий параметр копирования. По умолчанию копирование файлов и каталогов не перезаписывает существующие и не копирует атрибуты файлов.

Это поведение можно изменить, используя следующие параметры копирования:

  • REPLACE_EXISTING - заменить файл, если он существует
  • COPY_ATTRIBUTES - копировать метаданные в новый файл
  • NOFOLLOW_LINKS - не переходить по символическим ссылкам

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

Давайте посмотрим на пример использования copy () с двумя аргументами Path :

Обратите внимание, что копии каталогов неглубокие , что означает, что файлы и подкаталоги в каталоге не копируются.

4. Apache Commons IO

Другой распространенный способ копирования файла с помощью Java - использование библиотеки commons-io .

Во-первых, нам нужно добавить зависимость:

Последнюю версию можно загрузить с Maven Central.

Затем, чтобы скопировать файл, нам просто нужно использовать метод copyFile (), определенный в классе FileUtils . Метод принимает исходный и целевой файл.

Давайте посмотрим на тест JUnit с использованием метода copyFile () :

5. Гуава

Наконец, мы взглянем на библиотеку Google Guava.

Опять же, если мы хотим использовать Guava , нам нужно включить зависимость:

Последнюю версию можно найти на Maven Central.

А вот способ копирования файла с помощью Guava:

6. Заключение

В этой статье мы изучили наиболее распространенные способы копирования файла на Java.

Хотя Java предоставляет класс операций ввода-вывода, который может обрабатывать файлы. Но нет возможности копировать файлы. Копирование файлов - важная операция, когда вашей программе приходится иметь дело со многими связанными файлами. Однако есть несколько способов скопировать файлы Java, наиболее популярные из которых перечислены ниже.

1. Скопируйте с помощью FileStreams

Это самый классический способ скопировать содержимое одного файла в другой. Используйте FileInputStream для чтения байтов файла A и используйте FileOutputStream для записи в файл B. Это код первого метода:

Как видите, мы выполняем несколько операций чтения и записи для проверки данных, так что это должно быть неэффективно, в следующем методе мы увидим новые способы.

2. Скопируйте с помощью FileChannel

Java NIO включает метод transferFrom, который согласно документации должен быть быстрее, чем копия файлового потока. Это код для второго метода:

3. Скопируйте с помощью Commons IO.

Apache Commons IO предоставляет метод копирования файлов в своем классе FileUtils, который можно использовать для копирования файла в другое место. Когда вы уже используете свой проект, очень удобно использовать класс Apache Commons FileUtils. По сути, этот класс внутренне использует Java NIO FileChannel. Это код для третьего метода:

4. ИспользуйтеJava7Копия класса файлов

Если у вас есть некоторый опыт работы с Java 7, вы можете знать, что вы можете использовать класс Files метода копирования для копирования файлов из одного файла в другой. Это код четвертого метода:

5. Тестирование

Теперь, чтобы увидеть, какой из этих методов более эффективен, мы скопируем большой файл и будем использовать каждый в простой программе. Из кеша, чтобы избежать очевидной производительности, мы будем использовать четыре разных исходных файла и четыре разных целевых файла. Посмотрим на код:

Как видите, FileChannels - лучший способ копировать большие файлы. Если вы работаете с большими файлами, вы заметите большую разницу в скорости. Это пример, демонстрирующий четыре различных метода в Java для копирования файла.

Читайте также: