JavaのFileLockを使用する場合、close()にlock.release()を自動的に実行させることはできますか?

StackOverflow https://stackoverflow.com/questions/421833

  •  05-07-2019
  •  | 
  •  

質問

ほとんどの人が知っているように、 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 がチャネルを閉じ、ロックを解除するように見えます。

他のヒント

はい。

ロックはファイル記述子に依存します。プロセス内のファイルを表すファイル記述子がない場合、それに関連付けられたロックはありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top