13

ほとんどの人が知っているclose()ように、ストリームが使用するものも閉じます。

これにより、次のコードが可能になります。

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(...)));
...
br.close();

FileInputStreamへの参照を必要とせず、閉じることを忘れないので、これは素晴らしいことです。

しかし、それはsでも機能しFileLockますか?

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()が呼び出されたときにロックが正しく解放されましたが、そうしても安全ですか? Closeable JavaDocは、「このストリームを閉じて、それに関連付けられているシステム リソースをすべて解放します」と述べています。ロックclose()に指定されたとおり に使用していると想定しても安全ですか?release()

4

2 に答える 2

9

JavaDocによると:

release メソッドを呼び出すか、ロックを取得するために使用されたチャネルを閉じるか、または Java 仮想マシンを終了するかのいずれか早い方によって、ロックが解放されるまで有効です。

で、内容はこちらFileInputStream.close()

public void close() throws IOException {
    if (channel != null)
        channel.close();
    close0();
}

closeストリーム上で、ロックを解除するチャネルを閉じるように見えます。

于 2009-01-07T20:11:30.837 に答える
1

はい。

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

于 2009-01-07T19:59:14.480 に答える