2010-12-29 7 views
4

例:私のコードは現在以下のように見えます。 lock.releaseを明示的に呼び出す必要がありますか、またはFileOutputStreamが終了したときに自動的に解放されますか?対応するストリームが閉じられているときにJava FileChannelロックが閉じられているか、明示的に閉じる必要がありますか?

var os:FileOutputStream = null 
var writer:PrintWriter = null 
try { 
    os = new FileOutputStream(name, false) 
    val lock = os.getChannel().tryLock 
    if(lock != null) { 
    writer = new PrintWriter(new BufferedWriter(new 
     OutputStreamWriter(os))) 
    (write stuff to file) 
    } else { 
    (error stuff) 
    } 
} finally { 
    if(writer != null) writer.close 
    os.close 
} 

答えて

5

FileLockのJavadocによると:

「ファイルロックオブジェクトは最初は有効でロックが解除メソッドを呼び出すことによって解放されるまで、それがそのチャネルを閉じることで、有効なままです。それを取得するために、またはJava仮想マシンの終了によって、どちらか早い方が先に到着しました」

...ストリームを閉じると、下にあるチャネルが閉じられると仮定します。

4

は、それが解放されるだろう想像が、私は、私はfinallyブロックでこれでそれを確認したとして、好奇心:

println("Lock: " + lock.isValid) 
if (writer != null) writer.close 
println("Lock: " + lock.isValid) 
os.close 
println("Lock: " + lock.isValid) 

そして、これは結果であった:

Lock: true 
Lock: false 
Lock: false 

は、それが時に清掃ますようですあなたは作家を閉じます。

0

この疑問は私が同じ疑いでグーグルグーグルで起きたときに起きました。

絶対的な答えが見つからないため、私はいくつかのテストを行った。

私は、はい、単にライターを閉じてロックを解除することを確認できます。ライターの下にあるストリームを手動で閉じる必要はありません。私がテストしたどの

1)私はデバッグモードでEclipseでコードを実行します。 2)ファイルへの書き込みとフラッシュ(閉じる前)後、Windowsエクスプローラを使用してファイルを削除しようとしました。予想どおり、ロックのために失敗しました。 3)writer.close()メソッドを一度実行したが、実行を完了する前に再度ファイルを削除しようとしました。問題なく削除しました。

これは、close()メソッドによってロックが解除されることを明確に示しています。

注:上記はJDKのFileクラスのみです。 java.io.Fileを拡張するライブラリは、動作が異なる場合があります。例えば、iSeriesのIfsJavaFileを使用すると、iSeries固有のサーバー接続オブジェクトもリリースしない限り、接続メモリー・リークが発生します。

関連する問題