Es kommt häufig vor, dass mehrere Programme dieselbe Datei gleichzeitig verarbeiten, beispielsweise aktualisieren oder lesen. Solche Probleme sollten angegangen werden, sonst kann es zu Chaos kommen. Nach JDK 1.4 bietet Java eine Dateisperrfunktion , die bei der Lösung solcher Probleme helfen kann.
Die Klassen FileLock und FileChannel befinden sich in den Paketen java.nio bzw. java.nio.channels. Dateisperren können verwendet werden, wenn die Eingabe- und Ausgabeströme Dateien lesen und schreiben. Im Folgenden wird die Klasse RandomAccessFile verwendet, um die Verwendung von Dateisperren zu veranschaulichen.
Der von RandomAccessFile erstellte Stream kann beim Lesen und Schreiben von Dateien Dateisperren verwenden. Solange die Sperre nicht aufgehoben wird, können andere Programme die gesperrte Datei nicht bedienen.
Die Schritte zur Verwendung der Dateisperre sind wie folgt:
1) Verwenden Sie zunächst den RandomAccessFile-Stream, um ein Stream-Objekt zu erstellen, das auf die Datei zeigt. Das Lese-/Schreibattribut des Objekts muss rw sein, zum Beispiel:
RandomAccessFileinput=newRandomAccessFile(Main.java,rw);
2) Der Eingabestream ruft die Methode getChannel() auf, um ein FileChannel-Objekt (Kanal) zu erhalten, das mit der zugrunde liegenden Datei verbunden ist, zum Beispiel:
FileChannelchannel=input.getChannel();
3) Der Kanal ruft die Methode tryLock() oder lock() auf, um ein FileLock-Objekt (Dateisperre) zu erhalten. Dieser Vorgang wird auch als Sperren der Datei bezeichnet, zum Beispiel:
FileLocklock=channel.tryLock();
Nachdem das Dateisperrobjekt generiert wurde, ist es jedem Programm untersagt, die Datei zu bearbeiten oder zu sperren. Wenn Sie nach dem Sperren einer Datei die Datei lesen oder schreiben möchten, müssen Sie das FileLock-Objekt release() aufrufen lassen, um die Dateisperre aufzuheben, zum Beispiel:
lock.release();
Beispielsweise hebt ein Java-Programm mit jedem Klick auf eine Schaltfläche eine Dateisperre auf, liest eine Textzeile aus der Datei und sperrt sie dann sofort. Wenn ein Java-Programm ausgeführt wird, können Benutzer keine anderen Programme verwenden, um vom aktuellen Java-Programm gesperrte Dateien zu bedienen. Beispielsweise können Benutzer keine vom aktuellen Java-Programm gesperrten Dateien mit dem von Windows bereitgestellten „Notepad“-Programm (Notepad.exe) speichern Betriebssystem.
Main.java
importjava.io.*;publicclassMain{publicstaticvoidmain(Stringargs[]){Filefile=newFile(Main.java);WindowFileLockwin=newWindowFileLock(file);win.setTitle(use file lock);}}
WindowFileLock.java
importjava.io.*;importjava.nio.*;importjava.nio.channels.*;importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;publicclassWindowFileLockextendsJframeimplementsActionListener{JTextAreatext;JButtonbutton;Filefile;RandomAccessFileinput; FileChannelchannel;FileLocklock;WindowFileLock(Filef){file=f;try{input=newRandomAccessFile(file,rw);channel=input.getChannel();lock=channel.tryLock();}catch(Exceptionexp){}text=newJTextArea ();button=newJButton(eine Zeile lesen);button.addActionListener(this);add(newJScrollPane(text),BorderLayout.CENTER);add(button,BorderLayout.SOUTH);setSize(300,400);setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}publicvoidactionPerformed(ActionEvente){try{lock.release();StringlineString=input.readLine();text.append(n+lineString);lock=channel.tryLock();if(lineString ==null)input.close();}catch(Exceptionee){}}}