0

を使用しStringBuilderてオブジェクトを作成してFileいますが、ファイルが存在するディレクトリが存在するかどうかを確認するためにも使用しています。

StringBuilder sbFile = new StringBuilder();
sbFile.append("/home/logs/");

File oFile = new File(sbFile.toString());

if(!oFile.exists())
    oFile.mkdir();

sbFile.append("MyLogFile.log");

oFile = new File(sbFile.toString());

しかし、文字列ビルダー ( vs )oFileの 2 つの異なる「バージョン」で同じ参照を再利用すると、メモリ リークが発生するのではないかと心配しています。もしそうなら、これをどのように別の方法で書くべきですか?/home/logs//home/logs/MyLogFile.log

4

3 に答える 3

6

メモリリークはありません。File初めて作成されたのインスタンスは、使用されなくなると JVM によってガベージ コレクションされます。

もう 1 つは、実際には を使用する必要がないことですStringBuilderクラスには、親とファイル名Fileを取るコンストラクタがあります。例は次のようになります。

File parent = new File("/home/logs/");
if(!parent.exists())
    parent.mkdir();

File file = new File(parent, "MyLogFile.log");
// TODO: do something with file...

また、 Java でガベージ コレクションがどのように機能するかに興味があるかもしれません。

于 2012-06-04T20:30:37.877 に答える
3

何も心配する必要はありません。Java では文字列は不変であり、メモリ リークは発生しません (少なくとも使用している方法では)。sbFile.toString()呼び出すたびに新しい不変文字列を作成します。

于 2012-06-04T20:29:22.820 に答える
0

メモリ リークはありません。ガベージ コレクタは、古い未使用オブジェクトのメモリを再利用するために返します。

File oFileコードで2つの異なるオブジェクトを使用することに関して。ここで作成する最初のオブジェクト:

File oFile = new File(sbFile.toString());

oFile 参照を再度使用し、古いオブジェクトがどこにも参照されていない場合、ガベージ コレクションを待機しています。

そのtoString StringBuilder sbFile() メソッドを使用するたびに、新しい不変の String オブジェクトが作成されます (Java の String オブジェクトは常に不変です)。したがって、2 番目のsbFile.toString()呼び出しで 2 番目の String オブジェクトが作成され、最初の String オブジェクトはガベージ コレクターによって安全に削除される可能性があります。

于 2012-06-04T20:45:18.330 に答える