Copiar un fichero con Java

11/Nov/2010 Java , , , , , , 12 Comentarios

En este ejemplo vamos a ver como podemos copiar un fichero con Java. De tal manera que acabemos teniendo un segundo fichero con el mismo contenido del primer fichero.

Lo primero que haremos será crear dos objetos de tipo File, los cuales representarán al fichero origen y al fichero destino:

  1. File origen = new File("origen.txt");
  2. File destino = new File("destino.txt");

La idea principal para copiar un fichero con Java será la de abrir un stream de lectura, es decir, un InputStream, sobre el fichero origen, realizar la lectura a la vez que abrimos un stream de escritura sobre el fichero destino, es decir, un OutputStream. Sobre este OutputStream realizaremos la escritura.

Nos apoyamos en los objetos File creados anteriormente, así como en las clases FileInputStream y FileOutputStream para abrir los stream a los ficheros:

  1. InputStream in = new FileInputStream(origen);
  2. OutputStream out = new FileOutputStream(destino);

Realizamos la lectura y escritura mientras existan datos en el stream de lectura

  1. byte[] buf = new byte[1024];
  2. int len;
  3.  
  4. while ((len = in.read(buf)) > 0) {
  5. out.write(buf, 0, len);
  6. }

Las lecturas las hacemos mediante el método .read().

Ya solo nos quedará cerrar los stream mediante el método .close() para finalizar el código de nuestro programa.

  1. in.close();
  2. out.close();

Cabe notar que necesitamos controlar la excepción IOException en todo el código. Es por ello, que todo el código lo tendremos en una estructura try-catch.

Ya ya tendremos realizado nuestro ejemplo que nos ayuda a copiar un fichero con Java.

Vídeos sobre Java IO


12 comentarios en “Copiar un fichero con Java”

Víctor Cuervo

Izak

Y para copiar varios ficheros a la vez *.txt como se hace?

Víctor Cuervo

compilex

Muchas gracias por este codigo, ahora tocaria hacer una especie de banner informativo, para que el programa mientras carga el archivo, muestre en pantalla algo asi como cargando 10% 20% etc…

Muchas gracias por su ayuda.

Víctor Cuervo

LAUREN

Y si quiero copiar el fichero en C y me aparece una excepcion de Acceso denegado?

Víctor Cuervo

jorge

Como siempre, simple y efectivo!!!

Me sirvió para importar .jpg y otros tipos de ficheros en un proyecto de almacenamiento de datos.

Exelente y gracias!!!

Víctor Cuervo

Dannte

Y si no fuera un .txt , si se tratara de un .jpg o .gif se puede hacer esto en java?

Víctor Cuervo

Manuel

Hola a todos, es posible copiar el contenido de un excel a otro excel que ya este creado, o bien exportar datos a un excel ya existente.

Saludos.

Víctor Cuervo

Víctor Cuervo

@Fercho G,

Buenas, hay dos formas de mover un archivo de un directorio a otro (aunque sea un fichero Excel).

La primera opción es utilizar el método .renameTo()

File fichero = new File("c:\\escritorio\\archivo1.xls");
if (fichero.renameTo(new File("c:\\escritorio\\documentos\\archivo1.xls")))
  System.out.println("Fichero movido");
else
  System.out.println("No se pudo mover el fichero");

El código completo lo tienes en http://lineadecodigo.com/java/renombrar-un-fichero-con-java-io/

La segunda opción sería copiar el fichero y borrar su origen. Para eso échale un ojo a los artículos http://lineadecodigo.com/java/copiar-un-fichero-con-java/ y http://lineadecodigo.com/java/borrar-un-fichero-con-java/

Espero que te sirva de ayuda.

Víctor Cuervo

Fercho G

Hola esta es la primera vez que visito este sitio, y espero puedan ayudarme a resolver unos problemas con este tema, espero explicar bien mi duda:

supongamos que este es mi archivo /escritorio/archivo1.xls y lo que quiero es moverlo dentro de una carpeta, /escritorio/documentos/archivo1.xls, lo que necesito saber es el código ya sea para moverlo de ubicación el archivo como un copiar y pegar ó la otra sería crear una copia del mismo archivo e indicar donde la quiero guardar.

el problema es que son archivos excel (.xls) y por eso necesitaría saber si se puede copiar el archivo y su contenido sin tener que usar el read y el write.

Víctor Cuervo

Chonyz

Hola Amigos de Linea de Codigo!!

Hace bastante los vengo siguiendo y me vienen ayudando mucho.. Gracias!!

Les escribo para consultarles:

Como puedo hacer para que EN DESTINO. txt NO SE COPIE una linea ingresada por el usuario..??

Por ejemplo si en el DESTINO.txt está escrita una linea que dice “Hola que tal??” y quiero copiar en DESTINO.txt todo el contenido sin la linea “Hola que tal??” como podría hacer??

Víctor Cuervo

lineadecodigo

@Garusis,

El uso del buffer es para mejorar la velocidad. Utilizando el buffer hacemos menos accesos I/O al disco, ya que vamos trayendo de 1Kb en 1Kb.

Normalmente, los buffers, suelen ser de 1Kb o 2Kb. Pero todo depende de la memoria de máquina que puedas ocupar. Supuestamente a mayor buffer, mejor lectura (si los ficheros son grandes).

Ahora que también se podría llevar todo el fichero a memoria. ¿Si tienes un fichero de 10Mb tiene sentido llevarlo entero a memoria?

No sé en que punto se pierde el rendimiento por un tamaño de buffer grande.

Así que dependiendo de la situación podrías utilizar un tamaño u otro. Sobre todo entendiendo el tamaño de los ficheros que leas.

Víctor Cuervo

leo

no sé pero quizas si el buffer es grande innecesariamente, digamos 10Mb, y el fichero tiene 5Kb el
soft lea 10Mb aún cuando descarte lo restante pero pierda tiempo en leer por gusto. En ese caso en
particular el buffer de 5kb leerá lo necesario y no pierde msec en leer por gusto. Si esto es así y se hace
con muchos fichros se acumulan las pérdidas de tiempo. Estoy pensando en 2 hilos de ejecucion por archivos a copiar. Uno lee de origen y el otro graba hacia destino de forma paralela. Esto evita que el que
copia espere por la lectura del otro. Evidentemente con todas las complicaciones que conlleva la programación de hilos.
Responde si entiendes.

Víctor Cuervo

Garusis

Mi pregunta seria, por que se usa un array de buffer da tamaño 1024… es algo fijo para este proceso??… o es lo recomendado???… o de donde salio???…

Responder a jorge Cancelar respuesta

Déjanos tu comentario, no te preocupes que tu email no será publicado

*

*