Ich habe einen Prozess, der eher häufig von Cron aufgerufen wird, um eine Datei zu lesen, die bestimmte move-bezogene Befehle enthält. Mein Prozess muss diese Datendatei lesen und schreiben - und sie muss gesperrt bleiben, um zu verhindern, dass andere Prozesse sie während dieser Zeit berühren. Ein vollständig separater Prozess kann von einem Benutzer ausgeführt werden, um (potentiell) in dieselbe Datendatei zu schreiben/anzuhängen. Ich möchte, dass diese beiden Prozesse gut ablaufen und nur einzeln auf die Datei zugreifen.Java FileLock zum Lesen und Schreiben
Das nio FileLock schien zu sein, was ich brauchte (kurz, meine eigenen Semaphor-Typ-Dateien zu schreiben), aber ich habe Probleme, es für das Lesen zu sperren. Ich kann gut sperren und schreiben, aber wenn ich versuche, beim Lesen eine Sperre zu erzeugen, bekomme ich eine NonWritableChannelException. Ist es sogar möglich, eine Datei zum Lesen zu sperren? Scheint wie eine RandomAccessFile ist näher zu dem, was ich brauche, aber ich sehe nicht, wie man das implementiert. 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 wird auf der FileLock Linie geworfen.
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 Sehen, sagt es
Ungeprüfter Ausnahme ausgelöst, wenn versucht wird, auf einen Kanal zu schreiben, die ursprünglich nicht zum Schreiben geöffnet wurde.
Aber ich muss nicht unbedingt darauf schreiben. Wenn ich versuche, einen FileOutpuStream usw. zum Schreiben zu erstellen, bin ich glücklich, bis ich versuche, einen FileInputStream für dieselbe Datei zu öffnen.
Haben Sie versucht, den Aufruf der Methode mit drei Parametern, FileLock lock (Long-Position, Long-Size, Boolean Shared) zu verwenden? Ich habe noch nie die FileLock verwendet, also werde ich nicht als Antwort posten, aber ich denke, die Verwendung dieser Methode kann helfen, da es so klingt, als ob Sie eine gemeinsame Sperre und keine exklusive Sperre benötigen, da Sie in die Datei schreiben wollen hat ein Schloss drauf. – ChadNC
Ich denke, die Absicht davon ist, nur Teile einer Datei zu sperren, jedoch möchte ich die gesamte Datei sperren, um mögliche Beschädigung zu verhindern. – bobtheowl2