Comparativa de Métodos de Copia de Archivos en Java: Eficiencia y Simplicidad

En Java, existen diversas estrategias para replicar el contenido de un archivo. A continuación, se presentan algunas de las más comunes:

1. Utilizando Streams de Bytes (FileInputStream y FileOutputStream)

Este es el enfoque más elemental, que opera a nivel de bytes individuales.

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopiaBasica {
    public static void main(String[] args) {
        String rutaOrigen = "archivo_fuente.dat";
        String rutaDestino = "archivo_copia.dat";

        try (FileInputStream entrada = new FileInputStream(rutaOrigen);
             FileOutputStream salida = new FileOutputStream(rutaDestino)) {
            int byteLeido;
            while ((byteLeido = entrada.read()) != -1) {
                salida.write(byteLeido);
            }
        } catch (IOException e) {
            System.err.println("Error al copiar el archivo: " + e.getMessage());
        }
    }
}

2. Empleando Métodos Estáticos de la Clase Files

Introducida en Java 7, la clase java.nio.file.Files ofrece una interfaz más depurada para operaciones con archivos.

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class CopiaConFiles {
    public static void main(String[] args) {
        Path rutaOrigen = Paths.get("archivo_fuente.dat");
        Path rutaDestino = Paths.get("archivo_copia.dat");

        try {
            Files.copy(rutaOrigen, rutaDestino);
        } catch (IOException e) {
            System.err.println("Error al copiar el archivo: " + e.getMessage());
        }
    }
}

3. Incorporando Streams Buffered (BufferedInputStream y BufferedOutputStream)

Este método optimiza la transferencia de datos mediante el uso de búferes internos, mejorando la velocidad.

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopiaConBuffer {
    public static void main(String[] args) {
        String rutaOrigen = "archivo_fuente.dat";
        String rutaDestino = "archivo_copia.dat";

        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(rutaOrigen));
             BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(rutaDestino))) {
            byte[] fragmento = new byte[8192]; // Búfer de 8KB
            int bytesLeidos;
            while ((bytesLeidos = bis.read(fragmento)) != -1) {
                bos.write(fragmento, 0, bytesLeidos);
            }
        } catch (IOException e) {
            System.err.println("Error al copiar el archivo: " + e.getMessage());
        }
    }
}

4. Aprovechando FileChannel de NIO

Este enfoque utiliza las capacidades de I/O No Bloqueante (NIO), siendo frecuentemente considerado uno de los más veloces.

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;

public class CopiaConNIO {
    public static void main(String[] args) {
        String rutaOrigen = "archivo_fuente.dat";
        String rutaDestino = "archivo_copia.dat";

        try (FileInputStream fis = new FileInputStream(rutaOrigen);
             FileOutputStream fos = new FileOutputStream(rutaDestino);
             FileChannel canalOrigen = fis.getChannel();
             FileChannel canalDestino = fos.getChannel()) {

            long posicion = 0;
            long tamano = canalOrigen.size();
            canalDestino.transferFrom(canalOrigen, posicion, tamano);

        } catch (IOException e) {
            System.err.println("Error al copiar el archivo: " + e.getMessage());
        }
    }
}

Análisis Comparativo:

  • Rendimiento: FileChannel > Streams con Búfer > Files.copy > Streams básicos.
  • Sintaxis: Files.copy > Streams con Búfer > Streams básicos > FileChannel.
  • Usabilidad: Files.copy destaca por su simplicidad y legibilidad, siendo ideal para la mayoría de las aplicaciones. Para requisitos de rendimiento extremos, FileChannel es la alternativa preferente.

Generalmente, se recomienda Files.copy por su equilibrio entre claridad y eficiencia. Si el rendimiento es crítico, FileChannel ofrece una optimziación superior.

Etiquetas: java IO NIO filechannel Streams

Publicado el 9-9 10:33