2013-04-12 7 views
7

Ho scoperto che il meccanismo di blocco del file Java è un errore reale poiché non è possibile eseguire la prima regola del blocco: bloccare una chiamata da bloccare! A meno che non mi sbagli: una chiamata a lock() genererà un'eccezione se un'applicazione mantiene già un blocco sul file, che so sarà il caso nella mia applicazione. Ho guardato attraverso alcune risposte qui e purtroppo non sto usando Java 7.Blocco Java FileLock senza eccezioni; in attesa del lucchetto

Qualcuno ha suggerimenti su come avrei potuto gestire in attesa di un blocco di file esclusiva senza mettere me stesso in un ciclo while(true) :)

EDIT dopo la risposta di Aubin (copia dal commento):

Quello che voglio fare è accedere a un file di grandi dimensioni dopo essere stato copiato in una directory e quindi elaborarlo. Il mio codice è semplice ...

public boolean ifFileReady(File file) { 
    boolean ready = false; 
    FileLock lock = null; 
    FileChannel channel = null; 
    try { 

     channel = new RandomAccessFile(file, "rw").getChannel(); 
     lock = channel.lock(); 
     lock.release(); 
     ready = true; 
    } 
    catch(IOException e) { 
     // Always Here 
    } 
    finally 
    { 
     if (channel != null) 
     channel.close(); 
    } 
    return ready; 
} 

Non blocco mai la serratura. Si butta sempre

+0

[Java 7 è obbligatorio ora] (http://www.oracle.com/technetwork/java/eol-135779.html) – Aubin

+0

Si prega di inviare la traccia dello stack, perché IOException può avere più origine o causa, come un accesso negato. Prova "r" solo in 'RandomAccessFile (file," rw ")' al posto di "rw". – Aubin

risposta

2

Copia del documentation di java.nio.channels.FileChannel:

pubblico blocco astratto FileLock (posizione lunga, Lunghi, booleano comune) throws IOException

acquisisce un blocco sulla regione data di questo canale di file.

Una chiamata di questo metodo bloccherà fino alla regione può essere bloccato , questo canale è chiuso, oppure il filo invocazione viene interrotto, se precedente.

dal: 1,4

+0

Quello che voglio fare è accedere a un file di grandi dimensioni dopo essere stato copiato in una directory e quindi elaborarlo. Il mio codice è semplice ... booleano pubblico ifFileReady (file file) { booleano pronto = falso; try { channel = new RandomAccessFile (file, "rw"). GetChannel(); lock = channel.lock(); blocco.pubblicazione(); ready = true; } catch (IOException e) { // sempre qui }} ho mai bloccare la serratura. Getta sempre. – jiveturkey

+0

Si prega di modificare il codice che ho incollato nella tua domanda perché il blocco non è definito e il ritorno manca. – Aubin

+0

Scusa, mi stavo conciliando. – jiveturkey

2

Il codice seguente dimostra che il blocco effettivamente blocco senza un'eccezione. Ho avuto un problema simile ma ho scoperto che l'eccezione era effettivamente causata dall'apertura del file rw quando il mio utente non aveva il permesso di farlo.

È un programma completo; eseguire due istanze di esso contemporaneamente per la manifestazione

import java.io.File; 
import java.io.RandomAccessFile; 
import java.nio.channels.FileChannel; 

public class Test { 
    public static void main(String args[]) throws Exception { 
    FileChannel channel = null; 
    File lockFile = new File("lock"); 
    System.out.println ("Opening file..."); 
    channel = new RandomAccessFile(lockFile, "rw").getChannel(); 
    System.out.println ("File open. Locking channel..."); 
    channel.lock(); 
    System.out.println ("Channel locked. Sleep for 30 seconds"); 
    Thread.sleep (30000); 
    System.out.println ("Process terminating"); 
    } 
} 

Per mantenere il codice più conciso Non ho incluso lo sblocco, chiusura o gestione delle eccezioni (si otterrà un avviso del compilatore). Tutte le risorse dovrebbero essere rilasciate automaticamente dal sistema operativo al termine del processo.