Меня всегда беспокоило, что единственный способ скопировать файл в Java - это открыть потоки, объявить буфер, прочитать один файл, пройти через него и записать его в другой поток. Сеть изобилует похожими, но все же немного отличающимися реализациями этого типа решения.
Есть ли лучший способ, который остается в пределах языка Java (то есть не подразумевает выполнение специфичных для ОС команд)? Возможно, в каком-нибудь надежном пакете утилит с открытым исходным кодом, который, по крайней мере, затмит эту базовую реализацию и предоставит однострочное решение?
Ответы:
Как упоминалось выше, Apache Commons IO - это путь, в частности FileUtils . copyFile () ; он берет на себя всю тяжелую работу за вас.
И, как постскриптум, обратите внимание, что в последних версиях FileUtils (таких как выпуск 2.0.1) добавлено использование NIO для копирования файлов; NIO может значительно повысить производительность копирования файлов , в значительной степени потому, что процедуры NIO откладывают копирование непосредственно в ОС / файловую систему, а не обрабатывают его, читая и записывая байты через уровень Java. Поэтому, если вы ищете производительность, возможно, стоит проверить, используете ли вы последнюю версию FileUtils.
источник
Я бы избегал использования мега-API, как Apache Commons. Это упрощенная операция, встроенная в JDK в новом пакете NIO. Это было отчасти уже связано с предыдущим ответом, но ключевой метод в API NIO - это новые функции «TransferTo» и «TransferFrom».
http://java.sun.com/javase/6/docs/api/java/nio/channels/FileChannel.html#transferTo(long,%20long,%20java.nio.channels.WritableByteChannel)
Одна из связанных статей демонстрирует отличный способ интеграции этой функции в ваш код с помощью метода TransferFrom:
Изучение NIO может быть немного сложнее, так что вы можете просто поверить этому механику, прежде чем уйти и попытаться изучить NIO в одночасье. Из личного опыта очень трудно научиться, если у вас нет такого опыта и вы познакомились с IO через потоки java.io.
источник
Теперь с Java 7 вы можете использовать следующий синтаксис try-with-resource:
Или, что еще лучше, это также может быть достигнуто с помощью нового класса Files, представленного в Java 7:
Довольно шикарно, а?
источник
Сервисный класс
Копирование каталога или файла
Перемещение каталога или файла
Копирование каталога или файла рекурсивно
источник
В Java 7 это просто ...
источник
Чтобы скопировать файл и сохранить его по пути назначения, вы можете использовать метод ниже.
источник
Обратите внимание, что все эти механизмы копируют только содержимое файла, а не метаданные, такие как разрешения. Таким образом, если вы скопируете или переместите исполняемый файл .sh в Linux, новый файл не будет исполняемым.
Чтобы действительно скопировать или переместить файл, то есть получить тот же результат, что и при копировании из командной строки, вам действительно нужно использовать собственный инструмент. Либо сценарий оболочки, либо JNI.
По-видимому, это может быть исправлено в Java 7 - http://today.java.net/pub/a/today/2008/07/03/jsr-203-new-file-apis.html . Скрещенные пальцы!
источник
В библиотеке Google Guava также есть метод копирования :
Предупреждение: Если
to
представляет существующий файл, этот файл будет перезаписан содержимымfrom
. Еслиto
иfrom
обратиться к одному и тому же файлу, содержимое этого файла будет удалено.Параметры:
from
- исходный файлto
- файл назначенияВыдает:
IOException
- если возникает ошибка ввода-выводаIllegalArgumentException
- еслиfrom.equals(to)
источник
Доступно как стандарт в Java 7, path.copyTo: http://openjdk.java.net/projects/nio/javadoc/java/nio/file/Path.html http://java.sun.com/docs/books/ учебник / важно / ю / copy.html
Я не могу поверить, что им потребовалось так много времени, чтобы стандартизировать что-то такое простое и простое, как копирование файлов :(
источник
Три возможные проблемы с приведенным выше кодом:
Вот почему
org.apache.tools.ant.util.ResourceUtils.copyResource
так сложно. Также обратите внимание, что хотя TransferFrom в порядке, TransferTo ломается на JDK 1.4 в Linux (см. Идентификатор ошибки: 5056395 ) - Джесси Глик Янисточник
Если вы находитесь в веб-приложении, которое уже использует Spring, и если вы не хотите включать Apache Commons IO для простого копирования файлов, вы можете использовать FileCopyUtils среды Spring.
источник
Вот три способа, которыми вы можете легко скопировать файлы с помощью одной строки кода!
Java7 :
java.nio.file.Files # копия
Appache Commons IO :
FileUtils # CopyFile
Гуава :
Файлы # копия
источник
Files.copy
используя только два параметра дляPath
кStream
. Просто добавьте параметрStandardCopyOption.COPY_ATTRIBUTES
илиStandardCopyOption.REPLACE_EXISTING
дляPath
кPath
источник
Копия NIO с буфером - самая быстрая в моем тесте. Посмотрите рабочий код ниже из моего тестового проекта на https://github.com/mhisoft/fastcopy
}
источник
Быстро и работать со всеми версиями Java, а также Android:
источник
Немного опоздал на вечеринку, но вот сравнение времени, затрачиваемого на копирование файла с использованием различных методов копирования файлов. Я перебрал методы 10 раз и набрал среднее. Передача файлов с использованием потоков ввода-вывода кажется худшим кандидатом:
Вот методы:
Единственный недостаток, который я вижу при использовании класса канала NIO, это то, что я все еще не могу найти способ показать промежуточный процесс копирования файла.
источник