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'
.
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
Il fornitore esterno modifica direttamente il file nel file system? O usa qualche interfaccia come un webservice? – Kai
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