Метод copy() Java java.nio.file.Files

Java File 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 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());
}

Копирование из входного потока в файл

Пример

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());
}

Примечания

  1. Копирование каталога: Files.copy()По умолчанию метод не копирует содержимое каталога рекурсивно; он копирует только пустые каталоги
  2. Символические ссылки: По умолчанию переходить по символическим ссылкам, если не указано иноеLinkOption.NOFOLLOW_LINKS
  3. Атомарность: Операции копирования файлов не являются атомарными и могут завершиться сбоем в процессе выполнения
  4. Производительность: Для больших файлов копирование NIO обычно эффективнее традиционного IO
  5. Обработка исключений: Необходимо обрабатывать исключения, которые могут быть выброшеныIOException

Сравнение с традиционным IO

Характеристика NIO Files.copy() Традиционный IO (FileInputStream/FileOutputStream)
Производительность Повышенный Нижний
Богатство функциональности Богаче Базовый
Обработка исключений Более лаконично Более громоздкая
Обработка символических ссылок Поддерживается Не поддерживается
Копирование атрибутов файла Поддерживается Не поддерживается

Лучшие практики

  1. Для простого копирования файлов используйте самый базовыйFiles.copy()форма
  2. Когда необходимо сохранить атрибуты файла, добавьтеCOPY_ATTRIBUTESoption
  3. При работе с целевым файлом, который может уже существовать, используйтеREPLACE_EXISTING
  4. Для больших файлов рассмотрите использованиеFiles.copy()вместо традиционных методов IO
  5. Всегда используйте try-with-resources для управления ресурсами потоков

Java File Java java.nio.file.Files

Другие расширения