ファイルの更新や読み取りを同時に行うなど、複数のプログラムが同じファイルを処理することはよくあります。このような問題には対処する必要があります。そうしないと混乱が生じる可能性があります。 JDK 1.4 以降、Java にはこのような問題の解決に役立つファイル ロック機能が提供されています。
FileLock クラスと FileChannel クラスは、それぞれ java.nio パッケージと java.nio.channels パッケージにあります。ファイル ロックは、入力ストリームと出力ストリームがファイルを読み書きするときに使用できます。以下では、RandomAccessFile クラスを使用してファイル ロックの使用法を示します。
RandomAccessFileによって作成されたストリームは、ファイルの読み取りおよび書き込み時にファイル ロックを使用できます。ロックが解除されない限り、他のプログラムはロックされたファイルを操作できません。
ファイルロックを使用する手順は次のとおりです。
1) まず、RandomAccessFile ストリームを使用して、ファイルを指すストリーム オブジェクトを作成します。オブジェクトの読み取り/書き込み属性は rw である必要があります。次に例を示します。
RandomAccessFileinput=newRandomAccessFile(Main.java,rw);
2) 入力ストリームはメソッド getChannel() を呼び出して、基になるファイルに接続されている FileChannel オブジェクト (チャネル) を取得します。次に例を示します。
FileChannelchannel=input.getChannel();
3) チャネルは、tryLock() または lock() メソッドを呼び出して、FileLock (ファイル ロック) オブジェクトを取得します。このプロセスは、次のようにファイルのロックとも呼ばれます。
FileLocklock=channel.tryLock();
ファイルロックオブジェクトが生成されると、いかなるプログラムもファイルの操作やロックが禁止されます。ファイルをロックした後、ファイルの読み取りまたは書き込みを行う場合は、FileLock オブジェクトで release() を呼び出してファイル ロックを解放する必要があります。次に例を示します。
ロック.リリース();
たとえば、Java プログラムは、ボタンをクリックするたびにファイルのロックを解除し、ファイルからテキスト行を読み取って、すぐにファイルをロックします。 Java プログラムの実行中は、現在の Java プログラムでロックされているファイルを他のプログラムで操作することはできません。たとえば、Windows が提供する「メモ帳」プログラム (Notepad.exe) を使用して、現在の Java プログラムでロックされているファイルを保存することはできません。オペレーティング·システム。 。
メイン.java
importjava.io.*;publicclassMain{publicstaticvoidmain(Stringargs[]){Filefile=newFile(Main.java);WindowFileLockwin=newWindowFileLock(file);win.setTitle(ファイルロックを使用);}}
ウィンドウファイルロック.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(行を読む);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){}}}