0

我正在使用 aStringBuilder创建一个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的两个不同“版本”上重用相同的引用会造成内存泄漏。如果是这样,我应该如何以不同的方式写这个?/home/logs//home/logs/MyLogFile.log

4

3 回答 3

6

没有内存泄漏。首次创建的实例,File在不再使用时会被 JVM 进行垃圾回收。

另一件事是您实际上并不需要使用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 引用并且在等待垃圾收集的任何地方都没有引用旧对象时。

每当StringBuilder sbFile您使用它的 toString() 方法时,都会创建一个新的不可变 String 对象(Java 中的 String 对象始终是不可变的)。因此,在第二次sbFile.toString()调用中,创建了第二个 String 对象,并且垃圾收集器可以安全地删除第一个 String 对象。

于 2012-06-04T20:45:18.330 回答