Метод copy() Java java.nio.file.Files
java.nio.file.Files.copy()— это служебный метод, предоставляемый в пакете Java NIO (New Input/Output), используемый для копирования файлов или каталогов между файловыми системами. Этот метод обеспечивает по сравнению с традиционнымjava.ioпакетом более эффективные и гибкие возможности работы с файлами.
Перегрузка методов
Files.copy()Метод имеет три основные перегруженные формы:
Копирование из входного потока в файл
public static long copy(InputStream in, Path target, CopyOption... options) throws IOException
Копирование из файла в выходной поток
public static long copy(Path source, OutputStream out) throws IOException
Копирование из файла в файл
public static Path copy(Path source, Path target, CopyOption... options) throws IOException
Сведения о параметрах
Входные параметры
- InputStream in: Входной поток для копирования
- Path source: Путь к исходному файлу
- Path target: Путь к целевому файлу
- OutputStream out: Выходной поток для записи
- CopyOption... options: Необязательные параметры копирования
Параметры CopyOption
Часто используемыеCopyOptionвключает:
StandardCopyOption.REPLACE_EXISTING: Если целевой файл уже существует, заменить егоStandardCopyOption.COPY_ATTRIBUTES: Копировать атрибуты файла в новый файлLinkOption.NOFOLLOW_LINKS: Не переходить по символическим ссылкам
Возвращаемое значение
- Для копирования из потока в файл: возвращает количество скопированных байтов
- Для копирования из файла в файл: возвращает путь к целевому файлу
- Для копирования из файла в поток: возвращает количество скопированных байтов
Примеры использования
Базовое копирование файла
Пример
Path source = Paths.get("source.txt");
Path target = Paths.get("target.txt");
try {
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
System.out.println("Файл успешно скопирован");
} catch (IOException e) {
System.err.println("Ошибка копирования: " + e.getMessage());
}
Path target = Paths.get("target.txt");
try {
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
System.out.println("Файл успешно скопирован");
} catch (IOException e) {
System.err.println("Ошибка копирования: " + e.getMessage());
}
Копирование файла с атрибутами
Пример
Path source = Paths.get("source.txt");
Path target = Paths.get("target.txt");
try {
Files.copy(source, target,
StandardCopyOption.REPLACE_EXISTING,
StandardCopyOption.COPY_ATTRIBUTES);
System.out.println("Файл и атрибуты успешно скопированы");
} catch (IOException e) {
System.err.println("Ошибка копирования: " + e.getMessage());
}
Path target = Paths.get("target.txt");
try {
Files.copy(source, target,
StandardCopyOption.REPLACE_EXISTING,
StandardCopyOption.COPY_ATTRIBUTES);
System.out.println("Файл и атрибуты успешно скопированы");
} catch (IOException e) {
System.err.println("Ошибка копирования: " + e.getMessage());
}
Копирование из входного потока в файл
Пример
try (InputStream in = new URL("http://example.com/file.txt").openStream()) {
Path target = Paths.get("downloaded.txt");
long bytesCopied = Files.copy(in, target);
System.out.println("Загрузка завершена, скопировано " + bytesCopied + " bytes");
} catch (IOException e) {
System.err.println("Ошибка загрузки: " + e.getMessage());
}
Path target = Paths.get("downloaded.txt");
long bytesCopied = Files.copy(in, target);
System.out.println("Загрузка завершена, скопировано " + bytesCopied + " bytes");
} catch (IOException e) {
System.err.println("Ошибка загрузки: " + e.getMessage());
}
Примечания
- Копирование каталога:
Files.copy()По умолчанию метод не копирует содержимое каталога рекурсивно; он копирует только пустые каталоги - Символические ссылки: По умолчанию переходить по символическим ссылкам, если не указано иное
LinkOption.NOFOLLOW_LINKS - Атомарность: Операции копирования файлов не являются атомарными и могут завершиться сбоем в процессе выполнения
- Производительность: Для больших файлов копирование NIO обычно эффективнее традиционного IO
- Обработка исключений: Необходимо обрабатывать исключения, которые могут быть выброшены
IOException
Сравнение с традиционным IO
| Характеристика | NIO Files.copy() | Традиционный IO (FileInputStream/FileOutputStream) |
|---|---|---|
| Производительность | Повышенный | Нижний |
| Богатство функциональности | Богаче | Базовый |
| Обработка исключений | Более лаконично | Более громоздкая |
| Обработка символических ссылок | Поддерживается | Не поддерживается |
| Копирование атрибутов файла | Поддерживается | Не поддерживается |
Лучшие практики
- Для простого копирования файлов используйте самый базовый
Files.copy()форма - Когда необходимо сохранить атрибуты файла, добавьте
COPY_ATTRIBUTESoption - При работе с целевым файлом, который может уже существовать, используйте
REPLACE_EXISTING - Для больших файлов рассмотрите использование
Files.copy()вместо традиционных методов IO - Всегда используйте try-with-resources для управления ресурсами потоков
Java java.nio.file.Files