Java-nio-filelock
提供:Dev Guides
Java NIO-FileLock
Java NIOは並行性とマルチスレッドをサポートしているため、複数のファイルで同時に動作する複数のスレッドを処理できますが、場合によっては、スレッドがファイルを共有せず、アクセスできないようにする必要があります。
そのような要件のために、NIOはファイル全体またはファイルの一部をロックするために使用されるFileLockと呼ばれるAPIを再度提供します。これにより、ファイルまたはその一部は共有またはアクセスできなくなります。
このようなロックを提供または適用するには、FileChannelまたはAsynchronousFileChannelを使用する必要があります。これは、この目的のために2つのメソッド* lock()*およびtryLock()を提供します。
- 排他ロック-排他ロックは、他のプログラムがいずれかのタイプの重複ロックを取得するのを防ぎます。
- 共有ロック-共有ロックは、同時に実行されている他のプログラムが重複する排他ロックを取得するのを防ぎますが、重複する共有ロックを取得することはできます。
ロックオーバーファイルを取得するために使用される方法-
- * lock()*-FileChannelまたはAsynchronousFileChannelのこのメソッドは、指定されたチャネルに関連付けられたファイルの排他ロックを取得します。このメソッドの戻り値の型は、取得したロックの監視にさらに使用されるFileLockです。
- * lock(long position、long size、boolean shared)*-このメソッドもロックメソッドのオーバーロードメソッドであり、ファイルの特定の部分をロックするために使用されます。
- * tryLock()*-ロックを取得できなかった場合、このメソッドはFileLockまたはnullを返し、このチャネルのファイルで明示的に排他ロックを取得しようとします。
- * tryLock(long position、long size、boolean shared)*-このメソッドは、このチャネルのファイルの特定の領域のロックを取得しようとします。
FileLockクラスのメソッド
- * acquiredBy()*-このメソッドは、ファイルロックが取得されたチャンネルを返します。
- * position()*-このメソッドは、ロックされた領域の最初のバイトのファイル内の位置を返します。ロックされた領域は、実際の基になるファイルに含まれる必要はなく、重複する必要もないため、このメソッドによって返される値はファイルの現在のサイズ。
- * size()*-このメソッドは、ロックされた領域のサイズをバイト単位で返します。ロックされた領域は、実際の基になるファイルに含まれる必要はなく、重複する必要もないため、このメソッドによって返される値はファイルの現在のサイズを超える場合があります。
- * isShared()*-このメソッドは、ロックが共有されているかどうかを判断するために使用されます。
- * overlaps(long position、long size)*-このメソッドは、このロックが指定されたロック範囲と重複するかどうかを示します。
- * isValid()*-このメソッドは、取得したロックが有効かどうかを判断します。ロックオブジェクトは、解放されるか、関連するファイルチャネルが閉じられるまで、どちらか先に来るまで有効です。
- * release()*-取得したロックを解除します。ロックオブジェクトが有効な場合、このメソッドを呼び出すとロックが解除され、オブジェクトが無効になります。 このロックオブジェクトが無効な場合、このメソッドを呼び出しても効果はありません。
- * close()*-このメソッドはrelease()メソッドを呼び出します。 クラスに追加されたため、自動リソース管理ブロック構造と組み合わせて使用できます。
ファイルロックを示す例。
次の例では、ファイルにロックを作成し、コンテンツを書き込みます
package com.java.nio;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
public class FileLockExample {
public static void main(String[] args) throws IOException {
String input = "Demo text to be written in locked mode.";
System.out.println("Input string to the test file is: " + input);
ByteBuffer buf = ByteBuffer.wrap(input.getBytes());
String fp = "D:file.txt";
Path pt = Paths.get(fp);
FileChannel channel = FileChannel.open(pt, StandardOpenOption.WRITE,StandardOpenOption.APPEND);
channel.position(channel.size() - 1);//position of a cursor at the end of file
FileLock lock = channel.lock();
System.out.println("The Lock is shared: " + lock.isShared());
channel.write(buf);
channel.close();//Releases the Lock
System.out.println("Content Writing is complete. Therefore close the channel and release the lock.");
PrintFileCreated.print(fp);
}
}
package com.java.nio;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class PrintFileCreated {
public static void print(String path) throws IOException {
FileReader filereader = new FileReader(path);
BufferedReader bufferedreader = new BufferedReader(filereader);
String tr = bufferedreader.readLine();
System.out.println("The Content of testout.txt file is: ");
while (tr != null) {
System.out.println(" " + tr);
tr = bufferedreader.readLine();
}
filereader.close();
bufferedreader.close();
}
}
出力
Input string to the test file is: Demo text to be written in locked mode.
The Lock is shared: false
Content Writing is complete. Therefore close the channel and release the lock.
The Content of testout.txt file is:
To be or not to be?Demo text to be written in locked mode.