Как скопировать файл Java
Обновлено: 21.11.2024
Копирование файла из одного места в другое в Java — это обычная задача, которую нам нужно выполнять в приложениях. В этом руководстве по Java мы увидим различные способы копирования файла в Java.
Во всех приведенных примерах мы будем копировать содержимое testoriginal.txt в другой файл testcopied.txt. Имя и расположение файлов можно заменить в любом из примеров.
Копирование не является атомарной операцией — в случае ошибки ввода-вывода, потери питания, завершения процесса или других проблем операция копирования не завершается. Если нам нужно защититься от этих условий, мы должны использовать другую синхронизацию на уровне файлов.
Копирование файла с помощью Files.copy()
Класс Files находится в пакете java.nio.file. Он предоставляет статические методы для работы с файлами, каталогами и другими типами файлов.
Используйте перечисление StandardCopyOption, определяющее способ копирования.
Скопировать файл Java с помощью FileChannel.transferTo()
Если вам нравится класс FileChannel за его блестящую производительность, используйте этот метод. Ключевым преимуществом здесь является то, что JVM использует доступ ОС к DMA (прямому доступу к памяти), если он есть.
При использовании этого метода данные передаются прямо с/на диск на шину, а затем в пункт назначения… минуя любую цепь через ОЗУ или ЦП.
Файл копирования Java с использованием Apache Commons IO
Чтобы использовать Apache Commons IO, нам нужно загрузить зависимость commons-io и включить ее в проект.
Используйте один из следующих классов для копирования одного файла в другой.
- FileUtils — внутри используется класс java.nio.file.Files, что эквивалентно использованию функции java.nio.file.Files.copy().
- IOUtils — копирует байты из большого (более 2 ГБ) InputStream в OutputStream. Этот метод использует предоставленный буфер, поэтому нет необходимости использовать BufferedInputStream .
Скопировать файл Java с помощью Guava
Чтобы использовать Guava, нам нужно загрузить зависимость com.google.guava и включить ее в проект.
Класс Files предоставляет служебные методы для работы с файлами. Метод Files.copy() копирует все байты из одного файла в другой.
После Java 7 в пакет Java IO не вносилось каких-либо существенных улучшений. Поэтому для любого более позднего выпуска Java (от Java 8 до Java 14) мы должны ответить на перечисленные выше методы.
Вы можете скопировать файл или каталог, используя метод copy(Path, Path, CopyOption. ). Копирование завершается ошибкой, если целевой файл существует, если не указан параметр REPLACE_EXISTING.
Каталоги можно копировать. Однако файлы внутри каталога не копируются, поэтому новый каталог пуст, даже если исходный каталог содержит файлы.
При копировании символической ссылки копируется цель ссылки. Если вы хотите скопировать саму ссылку, а не содержимое ссылки, укажите параметр NOFOLLOW_LINKS или REPLACE_EXISTING.
Этот метод принимает аргумент типа varargs. Поддерживаются следующие перечисления StandardCopyOption и LinkOption:
- REPLACE_EXISTING — выполняет копирование, даже если целевой файл уже существует. Если целью является символическая ссылка, копируется сама ссылка (а не цель ссылки). Если целью является непустой каталог, копирование завершается с ошибкой DirectoryNotEmptyException.
- COPY_ATTRIBUTES — копирует атрибуты файла, связанные с файлом, в целевой файл. Точные поддерживаемые атрибуты файла зависят от файловой системы и платформы, но время последнего изменения поддерживается на разных платформах и копируется в целевой файл.
- NOFOLLOW_LINKS — указывает, что символические ссылки не следует использовать. Если копируемый файл является символической ссылкой, копируется ссылка (а не цель ссылки).
Если вы не знакомы с перечислениями , см. раздел Типы перечислений.
Ниже показано, как использовать метод копирования:
Помимо копирования файла, класс Files также определяет методы, которые можно использовать для копирования между файлом и потоком. Метод copy(InputStream, Path, CopyOptions. ) может использоваться для копирования всех байтов из входного потока в файл. Метод copy(Path, OutputStream) может использоваться для копирования всех байтов из файла в выходной поток.
В примере Copy используются методы copy и Files.walkFileTree для поддержки рекурсивного копирования. Дополнительную информацию см. в разделе «Обход дерева файлов».
Я хочу скопировать файл из одного места в другое место на Java. Как лучше всего это сделать?
Вот что у меня есть:
Это не копирует файл, как лучше всего это сделать?
Я не уверен, зачем вам это нужно, однако взгляните на Коллекции, я бы сосредоточился где-нибудь на Списке
8 ответов 8
Вы можете использовать это (или любой другой вариант):
Кроме того, я бы рекомендовал использовать File.separator или / вместо \\, чтобы сделать его совместимым с несколькими ОС, вопросы и ответы по этому поводу доступны здесь.
Поскольку вы не знаете, как временно хранить файлы, взгляните на ArrayList :
Чтобы переместить список файлов в один каталог:
@vijayk Если бы вы нашли время, чтобы прочитать ссылки, которые я предложил, вы бы нашли ряд полезных идей, таких как «Прогулка по дереву файлов».
+1 за Files.copy, но я не согласен с File.separator, File все равно нормализует путь, поэтому косая черта назад или вперед не имеет значения.
@vijayk: вы используете ArrayList для хранения строк, которые не будут работать. Вы также используете массив для хранения файлов, хотя помните, что это фиксированный размер, и вы не можете добавлять к массиву, используйте только доступные ключи (например, myFileArray[0] = new File(""); ).
Обновление:
Использование потока
Использование канала
Использование библиотеки Apache Commons IO:
Использование класса файлов Java SE 7:
Или попробуйте Google Guava :
Спасибо, Apache Commons FileUtils спас мне жизнь, так как мне нужно было собрать старый проект Java 6, где пакеты nio недоступны. FileUtils.copyFile(. ) даже короче/удобнее, чем nio Files.copy(. ) из-за отсутствия необходимости конвертировать файлы в путь.
Вы также можете попробовать библиотеку гуавы Google. будьте осторожны, некоторые версии не поддерживают Java 6 .. я обновлю свой пост в следующие дни
В этом ответе может потребоваться обновление, поскольку в файле размером 100 МиБ копирование канала постоянно быстрее в 1,5 раза по сравнению с потоком, использующим лучший из буферов размером 8, 16, 32 или 64 КиБ (буферы размером 1024 байта были еще медленнее).
Используйте классы New Java File в Java >=7.
Создайте указанный ниже метод и импортируйте необходимые библиотеки.
Используйте созданный метод, как показано ниже, в main:
Примечание: fileFrom — это файл, который вы хотите скопировать в новый файл fileTo в другой папке.
Это можно сделать с помощью Java 8 Streaming API, PrintWriter и Files API
Перезапись существующих файлов: Files.move()
Копировать файл из одного места в другое означает, что необходимо скопировать весь контент в другое место. Files.copy(Path source, Path target, CopyOption. options) выдает IOException, этот метод ожидает исходное местоположение, которое является исходным местоположением файла, и целевое местоположение, которое является новым местоположением папки с целевым файлом того же типа (как оригинал). В нашей системе должно существовать любое целевое местоположение, в противном случае нам нужно создать местоположение папки, а затем в этом расположении папки нам нужно создать файл с тем же именем, что и исходное имя файла. Затем, используя функцию копирования, мы можем легко скопировать файл из одного места другим.
Я согласен с вами в одном вопросе. Где я вижу в большинстве ответов, они используют один и тот же каталог. Я ожидал, что они будут использовать другой источник (каталог) и другой пункт назначения (каталог).
Я изменил один из ответов, чтобы сделать его более эффективным.
Не тот ответ, который вы ищете? Просмотрите другие вопросы с тегами java io или задайте свой вопрос.
Связано
Связанные
Горячие вопросы о сети
Чтобы подписаться на этот RSS-канал, скопируйте и вставьте этот URL-адрес в программу для чтения RSS.
дизайн сайта / логотип © 2022 Stack Exchange Inc; вклады пользователей под лицензией cc by-sa. версия 2022.3.28.41778
В учебном пособии по копированию файла Java мы покажем, как копировать файл в Java. Мы копируем файлы со встроенными классами, включая File, FileInputStream, FileOutputStream, FileChannel и Files. Мы также используем две сторонние библиотеки: Apache Commons IO и Google Guava.
— это создание нового файла с тем же содержимым, что и у существующего файла. передает файл из одного места в другое.
Файл, который нужно скопировать, называется исходным файлом, а новая копия называется конечным файлом.
Файл ошибок
В этом примере мы используем файл bugs.txt.
Это простой файл, содержащий имена ошибок.
Файл копирования Java с FileInputStream и FileOutputStream
С помощью FileInputStream и FileOutputStream мы создаем потоки для чтения и записи в файл. Если файл не найден, создается исключение FileNotFoundException. Файл — это представление файла или каталога в Java.
В этом примере файл копируется с помощью FileInputStream , FileOutputStream и File .
Мы создаем экземпляры FileInputStream и FileOutputStream. Оператор try-with-resources автоматически закроет потоки.
Мы будем копировать куски текста по 1024 байта. Это сделано для повышения производительности.
Метод чтения FileInputStream считывает указанное количество байтов из входного потока и сохраняет их в буферном массиве. Он возвращает общее количество байтов, считанных в буфер, или -1, если данных больше нет из-за достижения конца потока.
Метод записи FileOutputStream записывает байты, хранящиеся в буфере, в выходной поток. Первый параметр — это данные, второй — начальное смещение в данных, а последний — количество записываемых байтов.
Файл копии Java с путями и файлами
Следующий пример аналогичен предыдущему; он использует более современный API.
Мы копируем файл, используя классы Paths и Files.
Из файлов мы создаем объекты Path.
Потоки создаются с помощью класса Files.
Файл копирования Java с FileChannel
FileChannel – это канал для чтения, записи, сопоставления и управления файлом. FileChannel — это альтернатива классическому потоковому API ввода-вывода Java. Он находится в пакете java.nio.
RandomAccessFile поддерживает как чтение, так и запись в файл с произвольным доступом. Произвольный доступ означает, что мы можем читать или записывать информацию в любом месте файла.
В примере копируется текстовый файл с FileChannel .
Создается файл произвольного доступа в режиме чтения.
Создается файл произвольного доступа в режиме чтения/записи.
Мы получаем каналы из файлов с помощью getChannel .
Метод transferFrom передает байты из исходного канала в целевой канал. Первый параметр — исходный канал, второй — начальная позиция передачи в файле, а третий — максимальное количество байтов для передачи.
Java копирует файл с помощью Files.copy
В Java 7 появился метод Files.copy, обеспечивающий простой способ копирования файла. Копия завершается ошибкой, если целевой файл существует, если не указана опция REPLACE_EXISTING. Files.copy принимает необязательный аргумент параметров третьего копирования.
Параметр options может включать любое из следующего:
- REPLACE_EXISTING — если целевой файл существует, целевой файл заменяется, если он не является непустым каталогом.
- COPY_ATTRIBUTES — пытается скопировать атрибуты файла, связанные с этим файлом, в целевой файл.
- ATOMIC_MOVE — перемещает файл.
- NOFOLLOW_LINKS — переход по символическим ссылкам не выполняется.
Первые три параметра доступны в StandarCopyOption ; последний в LinkOption .
В этом примере файл копируется с помощью Files.copy . Он заменяет пункт назначения, если он уже существует.
Копирование файла Java с помощью Apache Commons IO
Apache Commons IO — это библиотека служебных программ, помогающих в разработке функций ввода-вывода. Он содержит метод FileUtils.copyFile для выполнения копирования. FileUtils.copyFile копирует содержимое указанного исходного файла в указанный файл назначения, сохраняя дату файла. Каталог, содержащий файл назначения, создается, если он не существует. Если целевой файл существует, этот метод перезапишет его.
Для этого примера нам нужен артефакт commons-io.
В примере копируется файл с FileUtils.copyFile Apache Commons.
Java копирует файл с помощью Guava
Google Guava – это набор общих библиотек для Java с открытым исходным кодом. Он включает Files.copy для копирования файла.
Мы используем зависимость от Guava.
В примере копируется файл с помощью Files.copy Guava.
В этом руководстве мы показали несколько способов копирования файла в Java. Мы использовали встроенные инструменты и сторонние библиотеки.
Копирование файла Java – очень распространенная операция. Но класс java.io.File не имеет быстрого метода для копирования файла из источника в место назначения. Здесь мы узнаем о четырех различных способах копирования файла в Java.
Файл копирования Java
Это обычный способ копирования файлов в Java. Здесь мы создаем два файла — исходный и целевой. Затем мы создаем InputStream из исходного кода и записываем его в целевой файл, используя OutputStream для операции копирования файла Java.
Вот метод, который можно использовать для копирования файла Java с использованием потоков.
Класс Java NIO был представлен в Java 1.4, а FileChannel можно использовать для копирования файла в java. Согласно методу transferFrom() javadoc, этот способ копирования файла должен быть быстрее, чем использование Streams для файлов копирования java.
Вот метод, который можно использовать для копирования файла с помощью FileChannel.
- Файл копирования Java — Apache Commons IO FileUtils
Apache Commons IO FileUtils.copyFile(File srcFile, File destFile) может использоваться для копирования файла в java. Если вы уже используете Apache Commons IO в своем проекте, имеет смысл использовать его для простоты кода. Внутри он использует Java NIO FileChannel, поэтому вы можете избежать этого метода-оболочки, если вы еще не используете его для других функций.
Вот метод использования apache commons io для операции копирования файла java.
Если вы работаете с Java 7 или выше, вы можете использовать метод класса Files copy() для копирования файла в java. Для копирования файлов используются поставщики файловой системы.
Теперь, чтобы выяснить, какой метод является самым быстрым, я написал тестовый класс и выполнил вышеперечисленные методы один за другим для копирования файла размером 1 ГБ.В каждом вызове я использовал разные файлы, чтобы избежать каких-либо преимуществ для более поздних методов из-за кэширования.
Из вывода видно, что потоковое копирование — лучший способ скопировать файл в Java. Но это очень простой тест. Если вы работаете над проектом, требующим высокой производительности, вам следует попробовать различные методы копирования файла Java и записать время, чтобы определить наилучший подход для вашего проекта.
Вам также следует поэкспериментировать с различными способами копирования файлов Java в зависимости от среднего размера файла.
Я создал видео на YouTube для 4 способов копирования файла в Java, вы можете посмотреть его, чтобы узнать больше.
Разрешения для файлов Java
Как открыть файл в Java
Мне нравятся технологии с открытым исходным кодом, и я люблю писать о своем опыте работы с ними.
Комментарии
Привет
У меня проблема, как мне помочь?
Я хочу закодировать серверный сокет с помощью метода создания, копирования и удаления файла, но я не знаю, что делать.
private static void copyFileUsingStream (источник файла, место назначения файла) выдает IOException InputStream is = null;
OutputStream os = null;
try is = new FileInputStream(source);
os = новый FileOutputStream(dest);
байт[] буфер = новый байт[1024];
целая длина;
в то время как ((длина = is.read(буфер)) > 0) os.write(буфер, 0, длина); // В этой строке обнаружена уязвимость (сохраненный XSS).
>
> наконец is.close();
os.close();
>
>
Это уже упоминалось в комментарии выше, но когда вы определили размер буфера чтения/записи, я обнаружил, что вам лучше придерживаться по крайней мере 64 КБ (65536), поскольку это самый большой размер кластера NTFS (4 КБ по умолчанию , а также в большинстве других файловых систем).
На самом деле, с обычными потоками ввода-вывода даже быстрее, если вы используете мегабайты — вы можете достичь скорости 150 Мбит/с на быстрых дисках/RAID-массивах на шпинделях и больше на SSD.
Метод copyFile в Java 7 выглядит красиво, но вы теряете контроль, например, над влияние на пропускную способность, если вы хотите ограничить копирование, что вы можете сделать, рассчитав миллисекунды, которые вы хотите, например, для 1 МБ, и подождите остальные миллисекунды, если вы быстрее. Это позволит не замедлять работу системы.
Кроме того, вместо копирования внутри одной и той же файловой системы (диск/рейд-массив/монтирование NFS/монтирование CIFS) в Java 7 вместо этого можно использовать жесткую ссылку, экономя место (полезно для отдельных списков воспроизведения мультимедиа).
Читайте также: