Ho un processo che verrà chiamato piuttosto frequentemente da cron per leggere un file che contiene determinati comandi relativi allo spostamento. Il mio processo deve leggere e scrivere su questo file di dati e tenerlo bloccato per evitare che altri processi lo tocchino durante questo periodo. Un processo completamente separato può essere eseguito da un utente per scrivere/aggiungere (potenziale) a questo stesso file di dati. Voglio che questi due processi funzionino bene e accedano al file solo uno alla volta.Java FileLock per lettura e scrittura
Il nio FileLock sembrava essere quello di cui avevo bisogno (a meno di scrivere i miei file di tipo semaforo), ma ho problemi a bloccarlo per la lettura. Posso bloccare e scrivere bene, ma quando tento di creare il blocco durante la lettura ottengo una NonWritableChannelException. È anche possibile bloccare un file per la lettura? Sembra che un RandomAccessFile sia più vicino a quello di cui ho bisogno, ma non vedo come implementarlo.
Qui è il codice che non riesce:
FileInputStream fin = new FileInputStream(f);
FileLock fl = fin.getChannel().tryLock();
if(fl != null)
{
System.out.println("Locked File");
BufferedReader in = new BufferedReader(new InputStreamReader(fin));
System.out.println(in.readLine());
...
L'eccezione viene generata sulla linea FileLock.
java.nio.channels.NonWritableChannelException
at sun.nio.ch.FileChannelImpl.tryLock(Unknown Source)
at java.nio.channels.FileChannel.tryLock(Unknown Source)
at Mover.run(Mover.java:74)
at java.lang.Thread.run(Unknown Source)
Guardando le JavaDocs, si dice
eccezione incontrollato generata quando viene effettuato un tentativo di scrivere su un canale che non è stato originariamente aperto per la scrittura.
Ma non ho necessariamente bisogno di scriverlo. Quando provo a creare un FileOutpuStream, ecc. Per scopi di scrittura, sono felice finché non provo ad aprire FileInputStream sullo stesso file.
Hai provato a utilizzare la chiamata al metodo tre param, blocco FileLock (posizione lunga, dimensione lunga, condivisione booleana)? Non ho mai usato il FileLock prima quindi non posterò come risposta, ma penso che usare quella chiamata di metodo possa essere d'aiuto dato che sembra che tu abbia bisogno di un blocco condiviso e non di un blocco esclusivo dal momento che vuoi scrivere sul file mentre ha un blocco su di esso. – ChadNC
Penso che l'intento sia quello di bloccare solo porzioni di un file, tuttavia vorrei bloccare l'intero file per prevenire e il possibile danneggiamento. – bobtheowl2