1. Copia de archivos
Método Files.copy: sintaxis básica
En Java, para copiar archivos y carpetas se usa el método estático Files.copy del paquete java.nio.file. Ya lo hemos visto, pero ahora lo estudiaremos con más detalle. Sintaxis básica de Files.copy:
Files.copy(Path source, Path target, CopyOption... options)
- source — ruta al archivo o carpeta de origen.
- target — ruta de destino (adonde copiar).
- options — opciones adicionales (por ejemplo, permitir la sobrescritura).
Ejemplo básico
Vamos a copiar el archivo "input.txt" del directorio actual a la carpeta "backup" con el nombre "input_backup.txt":
import java.nio.file.*;
public class CopyExample {
public static void main(String[] args) throws Exception {
Path source = Path.of("input.txt");
Path target = Path.of("backup/input_backup.txt");
Files.copy(source, target);
System.out.println("¡Archivo copiado!");
}
}
Puntos importantes:
- Si el archivo de destino ya existe, se lanzará la excepción FileAlreadyExistsException.
- Si la carpeta "backup" no existe, el método lanzará un error — ¡la carpeta debe crearse previamente!
Copia con sobrescritura
Para permitir la sobrescritura del archivo, usa la opción StandardCopyOption.REPLACE_EXISTING:
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
Tabla: opciones principales de copia
| Opción | Descripción |
|---|---|
|
Sobrescribir el archivo si ya existe |
|
Copiar atributos (fecha de creación, etc.) |
|
Movimiento atómico (solo se usa con move) |
Copiar un archivo a otra carpeta
Antes de copiar el archivo, asegúrate de que la carpeta de destino exista:
Path targetDir = Path.of("backup");
if (!Files.exists(targetDir)) {
Files.createDirectory(targetDir);
}
Files.copy(source, targetDir.resolve("input_backup.txt"), StandardCopyOption.REPLACE_EXISTING);
Copiar directorios: un matiz
El método Files.copy solo puede copiar carpetas como «carcasa vacía» — ¡el contenido (archivos y subcarpetas) no se copia! Si intentas copiar una carpeta con archivos, obtendrás solo un directorio vacío. Para copiar directorios completos con contenido, se requiere un recorrido recursivo y la copia manual de cada archivo (volveremos a ello en próximas lecciones).
Ejemplo: copiamos un archivo de una carpeta a otra
Path source = Path.of("data/report.txt");
Path target = Path.of("backup/report.txt");
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
Manejo de errores al copiar
La copia puede fallar por diversas razones: no hay acceso, el archivo está en uso, no hay espacio suficiente, el archivo ya existe, etc. Es mejor usar siempre try-catch:
try {
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
System.out.println("¡Copia realizada con éxito!");
} catch (FileAlreadyExistsException e) {
System.out.println("El archivo ya existe: " + target);
} catch (IOException e) {
System.out.println("Error de entrada/salida: " + e.getMessage());
}
2. Mover archivos y carpetas
Método Files.move: sintaxis
El movimiento de archivos y carpetas se realiza con el método:
Files.move(Path source, Path target, CopyOption... options)
Donde source es la ruta del archivo (de dónde movemos), target es adonde queremos colocar el archivo o la carpeta, y options son ajustes adicionales (por ejemplo, reemplazar un archivo existente).
Por cierto, mover no es solo «trasladar» un archivo, sino también una forma de renombrarlo (si solo cambia el nombre). Y si ya existe un archivo con ese nombre en la carpeta de destino, se lanzará una excepción si no se indica la opción REPLACE_EXISTING.
Ejemplo: mover un archivo a otra carpeta
Path source = Path.of("data/report.txt");
Path target = Path.of("archive/report.txt");
Files.move(source, target);
System.out.println("¡Archivo movido!");
Mover reemplazando un archivo existente
Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);
Mover una carpeta
Path oldDir = Path.of("data/old_reports");
Path newDir = Path.of("archive/old_reports");
Files.move(oldDir, newDir);
Toda la carpeta, incluidos los archivos y subcarpetas anidados, se moverá al nuevo lugar.
Pero si en la carpeta de destino ya existe una carpeta con ese nombre, obtendrás un error.
Mover entre distintos sistemas de archivos
Si mueves un archivo entre discos diferentes (por ejemplo, de "C:" a "D:"), internamente se realizará una copia y luego se eliminará el archivo original. Si la operación no se admite como atómica, puede lanzarse la excepción AtomicMoveNotSupportedException.
Diferencia entre move y copy
- copy — el archivo/carpeta de origen permanece en su lugar y aparece una copia.
- move — el archivo/carpeta de origen desaparece y solo queda la nueva ubicación.
3. Renombrar archivos y carpetas
En Java no hay un método específico para «renombrar un archivo». Renombrar es un caso particular de mover: indicas una ruta nueva con otro nombre en el mismo directorio.
Ejemplo: renombrar un archivo
Supongamos que tenemos el archivo "report.txt" y queremos renombrarlo a "report_old.txt" en la misma carpeta:
Path dir = Path.of("data");
Path oldName = dir.resolve("report.txt");
Path newName = dir.resolve("report_old.txt");
Files.move(oldName, newName);
System.out.println("¡Archivo renombrado!");
Aspectos importantes
Si en el directorio de destino ya existe un archivo o carpeta con el nombre que indicas, el método lanzará una excepción. Para evitar esta limitación y permitir el reemplazo, puedes usar la opción StandardCopyOption.REPLACE_EXISTING.
Ejemplo:
Path source = Paths.get("old_name.txt");
Path target = Paths.get("new_name.txt");
// Renombraremos el archivo; si ya existe, lo reemplazaremos
Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);
En este ejemplo, el archivo "old_name.txt" se renombrará a "new_name.txt". Si ya había un archivo con ese nombre en la carpeta, se sobrescribirá.
Renombrar una carpeta
Path oldDir = Path.of("data/old_reports");
Path newDir = Path.of("data/archived_reports");
Files.move(oldDir, newDir);
System.out.println("¡Carpeta renombrada!");
4. Manejo de errores al copiar, mover y renombrar
Trabajar con el sistema de archivos siempre implica el riesgo de situaciones inesperadas. Estos son los problemas más frecuentes:
El archivo ya existe.
Excepción: FileAlreadyExistsException. Solución: usa REPLACE_EXISTING si quieres sobrescribir.
El archivo o la carpeta están en uso por otro proceso.
Excepción: IOException. Por ejemplo, el archivo está abierto en otro programa.
No hay acceso al archivo o la carpeta.
Excepción: AccessDeniedException. Problema de permisos de usuario.
Mover entre distintos sistemas de archivos.
Excepción: AtomicMoveNotSupportedException. No todos los sistemas de archivos admiten movimiento atómico.
La carpeta de destino no existe.
Para copiar/mover, asegúrate de que la carpeta de destino se haya creado previamente.
Ejemplo de manejo de errores
try {
Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);
} catch (FileAlreadyExistsException e) {
System.out.println("El archivo de destino ya existe: " + target);
} catch (AtomicMoveNotSupportedException e) {
System.out.println("El movimiento atómico no es compatible: " + e.getMessage());
} catch (IOException e) {
System.out.println("Error al mover: " + e.getMessage());
}
5. Recomendaciones prácticas
Comprobar la existencia del archivo/carpeta de destino
Antes de copiar o mover, siempre es útil comprobar si la ruta de destino está ocupada:
if (Files.exists(target)) {
System.out.println("El archivo ya existe; no lo sobrescribiremos.");
} else {
Files.copy(source, target);
}
Uso de archivos temporales para operaciones seguras
En operaciones complejas (por ejemplo, actualización de archivos importantes) se suelen usar archivos temporales: primero se copia a un archivo temporal y luego se reemplaza el principal:
Path temp = Path.of("data/report.tmp");
Files.copy(source, temp, StandardCopyOption.REPLACE_EXISTING);
Files.move(temp, target, StandardCopyOption.REPLACE_EXISTING);
Este enfoque minimiza el riesgo de pérdida de datos ante fallos.
Ejemplo: copia de seguridad del archivo antes de reemplazarlo
Path file = Path.of("data/report.txt");
Path backup = Path.of("data/report_backup.txt");
if (Files.exists(file)) {
Files.copy(file, backup, StandardCopyOption.REPLACE_EXISTING);
System.out.println("Copia de seguridad creada.");
}
6. Tabla: métodos y opciones principales
| Operación | Método Java NIO | Características |
|---|---|---|
| Copia | |
¡No copia el contenido de las carpetas! |
| Mover | |
Se puede usar para renombrar |
| Renombrar | |
Ruta nueva en el mismo directorio |
| Sobrescritura | |
Sobrescribe el archivo/carpeta de destino |
| Comprobación | |
Comprueba la existencia del archivo/carpeta |
7. Errores típicos al copiar, mover y renombrar archivos
Error nº 1: intentar copiar un archivo a una carpeta inexistente. Si el directorio de destino no está creado, obtendrás NoSuchFileException. Solución: crea la carpeta de antemano con Files.createDirectories.
Error nº 2: intentar copiar una carpeta completa con Files.copy. El método copiará solo la «carcasa vacía», no el contenido. Para una copia completa se necesita un recorrido recursivo.
Error nº 3: no gestionar la existencia del archivo. Si no pasas REPLACE_EXISTING y el archivo ya existe, se lanzará una excepción. Es mejor gestionar este caso explícitamente.
Error nº 4: intentar renombrar un archivo cuando ya existe un archivo con el nuevo nombre. Del mismo modo, obtendrás FileAlreadyExistsException. Antes de renombrar, puedes comprobar la existencia del archivo.
Error nº 5: mover entre distintos sistemas de archivos. A veces la operación no se admite de forma «atómica» y se lanza AtomicMoveNotSupportedException. En este caso, usa un movimiento normal sin atomicidad.
Error nº 6: falta de permisos o bloqueo del archivo. Si el archivo está abierto en otro programa o no hay permisos de lectura/escritura, obtendrás AccessDeniedException o IOException. Gestiona siempre estas excepciones.
GO TO FULL VERSION