CodeGym /Cursos /JAVA 25 SELF /Copiar y mover archivos y carpetas

Copiar y mover archivos y carpetas

JAVA 25 SELF
Nivel 40, Lección 1
Disponible

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
StandardCopyOption.REPLACE_EXISTING
Sobrescribir el archivo si ya existe
StandardCopyOption.COPY_ATTRIBUTES
Copiar atributos (fecha de creación, etc.)
StandardCopyOption.ATOMIC_MOVE
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
Files.copy(source, target, ...)
¡No copia el contenido de las carpetas!
Mover
Files.move(source, target, ...)
Se puede usar para renombrar
Renombrar
Files.move(source, target, ...)
Ruta nueva en el mismo directorio
Sobrescritura
StandardCopyOption.REPLACE_EXISTING
Sobrescribe el archivo/carpeta de destino
Comprobación
Files.exists(path)
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.

1
Tarea
JAVA 25 SELF, nivel 40, lección 1
Bloqueada
Mover el informe reciente al archivo 📦
Mover el informe reciente al archivo 📦
1
Tarea
JAVA 25 SELF, nivel 40, lección 1
Bloqueada
Renombrar documento obsoleto 📝
Renombrar documento obsoleto 📝
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION