-1

私は現在、リソースを解放するためにJavaでこのようなことをしています。BufferedWriterオブジェクトでcloseを呼び出す必要がありますか、それともデストラクタで呼び出されますか?Resource1とResource2に関しては、リリースとフリーを尊重して呼び出す必要があります。これはネストされた試行での正しいアプローチですか?Pythonには、リソースをコードスコープに関連付ける非常に優れた「withステートメント」があります。javaにはいいねがありますか?

Resource1 r1 = new Resource1();
try
{
    ...
    Resource2 r1 = new Resource2();
    try
    {
        ...
        java.io.BufferedWriter f = new java.io.BufferedWriter(new java.io.FileWriter(new java.io.File("f")));
        try
        {
           ...
        }
        finally
        {
           f.close(); 
        }
    }
    finally
    {
        r2.release(); 
    }
}
finally
{
    r1.free(); 
}

更新: Java1.6を使用しています

4

2 に答える 2

3

あなたが持っているものBufferedWriterは正しいです。

ただし、 close中に発生するすべての例外を飲み込みたい場合があります。これは面倒ですが必要です。多くの場合、次のパターンが使用されます。

BufferedWriter f = null;
try {
  f = new BufferedWriter(...);
  ...
}
finally {
  try {
    if(f != null) {
      f.close();
    }
  }
  catch(IOException e) {
    // Nothing can be done, except maybe log it.
  }
}

IOUtils.finallyClose()を使用すると、閉じるときにキャッチする必要がなくなります。

Javaにはデストラクタの概念はありませんが、オブジェクトがガベージ コレクションされるときに呼び出されるfinalize()があります。オブジェクトを閉じたり、クリーンアップしたりするために依存するべきではありません。finialize()

ところで、Java 7では、 Closeableを実装するオブジェクトを閉じるための短い構文が導入されました。

try (BufferedWriter f = new BufferedWriter(new FileWriter(new File("f"))) {
  ...
}

編集:最後に拡張しました..閉じる。

于 2012-12-07T15:45:27.997 に答える
2

ファイルハンドルと他の同様のリソースを自分で閉じる必要があります。これを行うためにファイナライザーに依存するのは悪いアプローチです。

于 2012-12-07T15:40:11.537 に答える