Frage

Ich habe einen Prozess, der ziemlich häufig von cron aufgerufen wird, eine Datei zu lesen, die bestimmte Bewegung bezogene Befehle in sich hat. Mein Prozess muss und Schreiben auf diese Datendatei lesen - und halten Sie sie von anderen Prozessen zu berühren es während dieser Zeit zu verhindern gesperrt. Ein völlig separater Prozess kann durch einen Benutzer zu (potenziellen) Schreib- / append auf diese gleiche Datendatei ausgeführt werden. Ich möchte diese beiden Prozesse zu schön spielen und nur Zugriff auf die Datei einer nach dem anderen.

Die nio FileLock schien zu sein, was ich brauchte (kurz meine eigenen Semaphore Art Dateien zu schreiben), aber ich habe Probleme es zum Lesen zu verriegeln. Ich kann sperren und schreibe ganz gut, aber wenn man versucht, Sperre zu schaffen, wenn ich einen NonWritableChannelException bekommen zu lesen. Ist es sogar möglich, eine Datei zu sperren, zum Lesen? Scheint wie ein Random ist näher an, was ich brauche, aber ich sehe nicht, wie das implementieren.

Hier ist der Code, der fehlschlägt:

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());
          ...

Die Ausnahme von der FileLock Linie geworfen wird.

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)

an den JavaDocs Blick, heißt es

  

Nicht markiert Ausnahme ausgelöst, wenn ein Versuch zu schreiben, zu einem Kanal hergestellt ist, die ursprünglich nicht zum Schreiben geöffnet wurden.

Aber ich glaube nicht unbedingt brauchen, um es zu schreiben. Wenn ich versuche, eine FileOutpuStream Erstellen usw. für Zwecke zu schreiben ist es glücklich, bis ich versuche, ein Fileinputstream auf der gleichen Datei zu öffnen.

War es hilfreich?

Lösung

(a) Sind Sie sich bewusst, dass die Datei Sperren nicht andere Prozesse verhindern, sie zu berühren, wenn sie nicht auch Schlösser verwenden?
(B) Sie haben über einen beschreibbaren Kanal zu sperren. Holen Sie sich das Schloss über einen RandomAccessFile in „rw“ -Modus und dann FileInputStream öffnen. Darauf achten, dass es zu schließen!

Andere Tipps

Es wäre besser, wenn Sie die Sperre mit tryLock(0L, Long.MAX_VALUE, true) erstellt.

Dies schafft eine gemeinsame Sperre, die das Richtige ist für das Lesen zu tun.

tryLock() ist eine Abkürzung für tryLock(0L, Long.MAX_VALUE, false), das heißt, es fordert einen exklusiven Schreibsperre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top