Método copy() de 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ázaloStandardCopyOption.COPY_ATTRIBUTES: Copia los atributos del archivo al nuevo archivoLinkOption.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());
}
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());
}
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());
}
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
- Copia de directorios:
Files.copy()El método no copia recursivamente el contenido de los directorios por defecto, solo copia directorios vacíos - Enlaces simbólicos: Por defecto sigue los enlaces simbólicos, a menos que se especifique lo contrario
LinkOption.NOFOLLOW_LINKS - Atomicidad: La operación de copia de archivos no es atómica, puede fallar durante el proceso
- Rendimiento: Para archivos grandes, la copia con NIO suele ser más eficiente que con la IO tradicional
- Manejo de excepciones: Se deben manejar las excepciones que puedan lanzarse
IOException
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
- Para copias de archivos simples, use la más básica
Files.copy()forma - Cuando necesite conservar los atributos del archivo, agregue la
COPY_ATTRIBUTESopción - Al manejar archivos de destino que puedan existir, use
REPLACE_EXISTING - Para archivos grandes, considere usar
Files.copy()en lugar de métodos de IO tradicionales - Utilice siempre try-with-resources para manejar los recursos de flujo
Java java.nio.file.Files