JavaのFileLockを使用する場合、close()にlock.release()を自動的に実行させることはできますか?
質問
ほとんどの人が知っているように、 close()
は使用するストリームもすべて閉じます。
これにより、次のコードが許可されます。
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(...)));
...
br.close();
FileInputStream
への参照を必要とせず、忘れずに閉じてください。
しかし、 FileLock
sでも機能しますか?
final FileInputStream fis = new FileInputStream(new File("buffer.txt"));
final FileChannel c = fis.getChannel();
final FileLock lock = c.lock(0L, Long.MAX_VALUE, true);
final BufferedReader br = new BufferedReader(new InputStreamReader(fis));
try {
while(br.ready()) {
System.out.println(br.readLine());
}
} finally {
br.close();
}
このコードを試しましたが、 br.close()
が呼び出されたときにロックが正しく解除されましたが、そうしても安全ですか? クローズ可能なJavaDoc には、"このストリームを閉じて、それに関連付けられているシステムリソースをすべて解放します。" releaseで指定された
ロック? close()
を使用していると想定しても安全ですか? ()
解決
JavaDoc :
ロックが解除されるまで有効です リリースを呼び出してリリース メソッド、そのチャネルを閉じることにより それを取得するために、または Java仮想の終了 マシン、どちらか早い方。
そして、ここに FileInputStream.close()
public void close() throws IOException {
if (channel != null)
channel.close();
close0();
}
ストリームの close
がチャネルを閉じ、ロックを解除するように見えます。
他のヒント
はい。
ロックはファイル記述子に依存します。プロセス内のファイルを表すファイル記述子がない場合、それに関連付けられたロックはありません。
所属していません StackOverflow