2013-03-15 12 views
7

Sto usando apache util per copiare un file in una directory utilizzando il fileutil.copyFile(src, dest)Copia dei file utilizzando apache fileutil.copyfile

Il file sto copiando viene aggiornata ogni 2 secondi da un fornitore esterno e io davvero non voglio bloccarlo (la mia applicazione è in esecuzione in Windows - questo causerà tutti i tipi di problemi). Spero che qualcuno possa aiutarmi a consigliare quale sia il modo più sicuro di copiare o persino leggere un file senza che il file sorgente venga bloccato?

Cordiali saluti

+2

Si tratta di un'applicazione solo per Windows? E stai usando Windows Server? In tal caso, si potrebbe voler considerare il componente di replica dei file di DFS come un'alternativa * molto * valida a ciò che si sta tentando di fare ora. – Perception

+0

Il fornitore esterno modifica direttamente il file nel file system? O usa qualche interfaccia come un webservice? – Kai

+0

modifica direttamente il file - ogni 2 secondi. mi è capitato di leggere il file direttamente per copiare la lettura incase direttamente era più pericoloso. Sto solo indovinando però – Biscuit128

risposta

2

Poiché non si blocca esplicitamente l'intero file prima dell'azione di copia, il meccanismo di blocco del file os predefinito è al lavoro.

Ho eseguito un programma di test rapido per vedere cosa succede su una macchina Windows quando si copia un file sorgente mentre un processo esterno sta scrivendo sul file ogni 2 secondi.

Il processo che scrive sul file non ha mai riscontrato 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; 
    } 
} 

Il processo che copia il file sarà un'eccezione se non termina la copia prima della lunghezza modifiche apportate ai file sorgente. Sembra che questa eccezione sia più di un avviso che la versione copiata del file è incompleta. Quando sincronizzo i tempi per evitare di leggere dal file nello stesso momento in cui si scrive, questa eccezione non è stata generata.

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; 
    } 
} 

Sulla base di questo test non mi preoccuperei di ciò che accade al processo di scrittura. Vorrei fare qualcosa per gestire il caso quando viene lanciato java.io.IOException: Failed to copy full contents from '..\test.txt' to '..\test\test.txt'.

1

Questo è un estratto da How to Cache a File in Java, altri possono essere trovati lì.

caching dei file in Java


lettura dei file dal disco può essere lento, soprattutto quando un'applicazione legge lo stesso file più volte. Il caching risolve questo problema mantenendo i file frequentemente utilizzati in memoria. Ciò consente all'applicazione di leggere il contenuto della memoria locale veloce invece del disco rigido lento.Design per la memorizzazione nella cache di un file in Java include tre elementi:

  1. Un algoritmo per la memorizzazione nella cache il file
  2. Una struttura dati per tenere il contenuto della cache
  3. Un'API di cache per la memorizzazione di file memorizzati nella cache

Algoritmo per Caching file


Un algoritmo generale per la memorizzazione nella cache di un file deve tenere conto di modifiche di file e si compone delle seguenti fasi:

  1. ottenere un valore dalla cache utilizzando un percorso file completo come chiave .
  2. Se non viene trovata una chiave, leggere il contenuto del file e inserirlo nella cache .
  3. Se la chiave viene trovata, verificare se una data/ora del contenuto memorizzato nella cache corrisponde al timestamp del file.
  4. Se i timestamp sono uguali, restituire il contenuto memorizzato nella cache.
  5. Se i timestamp non sono uguali, aggiornare la cache leggendo il file e inserendolo nella cache.
Problemi correlati