Método copy() de Java java.nio.file.Files

Java File Java java.nio.file.Files


java.nio.file.Files.copy()Es un método utilitario del paquete Java NIO (New Input/Output) que se utiliza para copiar archivos o directorios entre sistemas de archivos. Este método proporciona, en comparación con el paquete tradicional,java.iocapacidades de operación de archivos más eficientes y flexibles.

Sobrecarga de métodos

Files.copy()El método tiene tres formas principales de sobrecarga:

Copiar de flujo de entrada a archivo

public static long copy(InputStream in, Path target, CopyOption... options) throws IOException

Copiar de archivo a flujo de salida

public static long copy(Path source, OutputStream out) throws IOException

Copia de archivo a archivo

public static Path copy(Path source, Path target, CopyOption... options) throws IOException

Explicación detallada de parámetros

Parámetros de entrada

  • InputStream in: El flujo de entrada a copiar
  • Path source: La ruta del archivo fuente
  • Path target: La ruta del archivo de destino
  • OutputStream out: El flujo de salida al que escribir
  • CopyOption... options: Opciones de copia opcionales

Opciones CopyOption

Las más utilizadasCopyOptionincluyen:

  • StandardCopyOption.REPLACE_EXISTING: Si el archivo de destino ya existe, reemplázalo
  • StandardCopyOption.COPY_ATTRIBUTES: Copia los atributos del archivo al nuevo archivo
  • LinkOption.NOFOLLOW_LINKS: No seguir enlaces simbólicos

Valor de retorno

  • Para la copia de flujo a archivo: devuelve el número de bytes copiados
  • Para la copia de archivo a archivo: devuelve la ruta del archivo de destino
  • Para la copia de archivo a flujo: devuelve el número de bytes copiados

Ejemplos de uso

Copia básica de archivos

Ejemplo

Path source = Paths.get("source.txt");
Path target = Paths.get("target.txt");

try {
    Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
    System.out.println("Copia de archivo exitosa");
} catch (IOException e) {
    System.err.println("Error de copia: " + e.getMessage());
}

Copia de archivos con atributos

Ejemplo

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("Copia de archivo y atributos exitosa");
} catch (IOException e) {
    System.err.println("Error de copia: " + e.getMessage());
}

Copia de flujo de entrada a archivo

Ejemplo

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("Descarga completada, se copiaron " + bytesCopied + " bytes");
} catch (IOException e) {
    System.err.println("Error de descarga: " + e.getMessage());
}

Precauciones

  1. Copia de directorios: Files.copy()El método no copia recursivamente el contenido de los directorios por defecto, solo copia directorios vacíos
  2. Enlaces simbólicos: Por defecto sigue los enlaces simbólicos, a menos que se especifique lo contrarioLinkOption.NOFOLLOW_LINKS
  3. Atomicidad: La operación de copia de archivos no es atómica, puede fallar durante el proceso
  4. Rendimiento: Para archivos grandes, la copia con NIO suele ser más eficiente que con la IO tradicional
  5. Manejo de excepciones: Se deben manejar las excepciones que puedan lanzarseIOException

Comparación con la IO tradicional

Característica NIO Files.copy() IO tradicional (FileInputStream/FileOutputStream)
Rendimiento Más alto Más bajo
Riqueza funcional Más rica Básica
Manejo de excepciones Más conciso Más engorroso
Manejo de enlaces simbólicos Soportado No soportado
Copia de atributos de archivo Soportado No soportado

Mejores prácticas

  1. Para copias de archivos simples, use la más básicaFiles.copy()forma
  2. Cuando necesite conservar los atributos del archivo, agregue laCOPY_ATTRIBUTESopción
  3. Al manejar archivos de destino que puedan existir, useREPLACE_EXISTING
  4. Para archivos grandes, considere usarFiles.copy()en lugar de métodos de IO tradicionales
  5. Utilice siempre try-with-resources para manejar los recursos de flujo

Java File Java java.nio.file.Files

Otras extensiones