make files example createtempfile commons java file file-io copy

java - files - Copiando archivos usando apache fileutil.copyfile



make a copy of a file java (3)

Eche un vistazo a http://docs.oracle.com/javase/6/docs/api/java/io/RandomAccessFile.html .

Quizás esto te ayude.

Estoy usando apache util para copiar un archivo a un directorio usando el fileutil.copyFile(src, dest)

El archivo que estoy copiando se actualiza cada 2 segundos por un proveedor externo y realmente no quiero bloquearlo (mi aplicación se ejecuta en Windows, esto causará todo tipo de problemas). Espero que alguien pueda ayudarme a asesorar sobre la forma más segura de copiar o incluso leer un archivo sin que el archivo fuente quede bloqueado.

Saludos cordiales


Como no está bloqueando explícitamente todo el archivo antes de la acción de copia, está en funcionamiento el mecanismo de bloqueo de archivos del sistema operativo predeterminado.

Ejecuté un programa de prueba rápido para ver qué sucede en una máquina con Windows cuando copias un archivo fuente mientras que un proceso externo escribe en el archivo cada 2 segundos.

El proceso que escribe en el archivo nunca tuvo un problema.

public static void main(String[] args) { File f = new File("..//test.txt"); long startTime = System.currentTimeMillis(); long elapsedTime = 0; while (elapsedTime < 1000 * 60) { try { FileUtils.writeStringToFile(f, System.currentTimeMillis()+" : Data Write/r/n", true); Thread.sleep(2000); } catch (IOException ex) { Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); } catch (InterruptedException ex){ Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); } elapsedTime = System.currentTimeMillis() - startTime; } }

El proceso que copia el archivo arrojará una excepción si no termina la copia antes de que el archivo fuente cambie de longitud. Parece que esta excepción es más una advertencia de que la versión copiada del archivo está incompleta. Cuando sincronice el tiempo para evitar leer el archivo al mismo tiempo que se produce la escritura, esta excepción no se lanzó.

public static void main(String[] args) { File f = new File("..//test.txt"); long startTime = System.currentTimeMillis(); long elapsedTime = 0; while (elapsedTime < 1000 * 60) { try { FileUtils.copyFile(f, new File("..//test//test.txt")); Thread.sleep(2000); } catch (IOException ex) { Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); } catch (InterruptedException ex){ Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); } elapsedTime = System.currentTimeMillis() - startTime; } }

Basado en esta prueba, no me preocuparía lo que ocurra con el proceso de escritura. Haría algo para manejar el caso cuando se java.io.IOException: Failed to copy full contents from ''../test.txt'' to ''../test/test.txt'' .


Este es un extracto de How to Cache a File en Java , se puede encontrar más allí.

Almacenamiento en caché de archivos en Java

Leer archivos del disco puede ser lento, especialmente cuando una aplicación lee el mismo archivo muchas veces. El almacenamiento en caché resuelve este problema manteniendo los archivos a los que se accede con frecuencia en la memoria. Esto permite que la aplicación lea el contenido de la memoria local rápida en lugar del lento disco duro. El diseño para almacenar en caché un archivo en Java incluye tres elementos:

  1. Un algoritmo para almacenar en caché el archivo
  2. Una estructura de datos para contener el contenido en caché
  3. Una API de caché para almacenar archivos almacenados en caché

Algoritmo para almacenar en caché los archivos

Un algoritmo general para almacenar en caché un archivo debe tener en cuenta las modificaciones de archivos y consta de los siguientes pasos:

  1. Obtenga un valor de la memoria caché utilizando una ruta de archivo totalmente calificada como clave.
  2. Si no se encuentra una clave, lea el contenido del archivo y póngalo en el caché.
  3. Si se encuentra la clave, verifique si una marca de tiempo del contenido en caché coincide con la marca de tiempo del archivo.
  4. Si las marcas de tiempo son iguales, devuelva el contenido en caché.
  5. Si las marcas de tiempo no son iguales, actualice la memoria caché leyendo el archivo y colocándolo en la caché.