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.copydestaca por su simplicidad y legibilidad, siendo ideal para la mayoría de las aplicaciones. Para requisitos de rendimiento extremos,FileChanneles 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.