Domanda

Ho un processo che si chiamerà piuttosto di frequente da cron per leggere un file che ha determinato movimento relativi comandi in esso. Il mio processo ha bisogno di leggere e scrivere file di dati - e tenerlo bloccato per evitare che altri processi di toccarla durante questo periodo. Un processo completamente separato può essere eseguito da un utente per (potenziale) scrivere / aggiungere a questo stesso file di dati. Voglio che questi due processi di bel gioco e l'accesso solo il file uno alla volta.

Il FileLock nio sembrava essere quello che mi serviva (a corto di scrivere il mio file di tipo semaforico), ma sto avendo difficoltà bloccandolo per la lettura. Posso bloccare e scrivere bene, ma quando si tenta di creare blocco durante la lettura ho ottenere un NonWritableChannelException. E 'anche possibile bloccare un file per la lettura? Sembra un RandomAccessFile è più vicino a quello che mi serve, ma non vedo come implementare questo.

Ecco 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

  

Non selezionata eccezione generata quando viene effettuato un tentativo di scrivere su un canale che non è stato originariamente aperto per la scrittura.

Ma non è necessariamente bisogno di scrivere. Quando ho provare a creare un FileOutpuStream, ecc per scrittura è felice fino a quando provo ad aprire un FileInputStream sullo stesso file.

È stato utile?

Soluzione

(a) Siete consapevoli del fatto che il blocco del file non mancherà di tenere altri processi di toccarla a meno che non usano anche le serrature?
(B) È necessario bloccare attraverso un canale scrivibile. Prendi il blocco tramite un RandomAccessFile in modalità "RW" e quindi aprire il FileInputStream. Assicurati di chiudere entrambe le cose!

Altri suggerimenti

Sarebbe meglio se è stato creato il blocco utilizzando tryLock(0L, Long.MAX_VALUE, true).

Questo crea un blocco condiviso che è la cosa giusta da fare per la lettura.

tryLock() è una scorciatoia per tryLock(0L, Long.MAX_VALUE, false), vale a dire si richiede un esclusivo scrittura di blocco.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top