我使用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());
但我担心在字符串构建器(oFile
vs /home/logs/
)的两个不同“版本”上重用相同的/home/logs/MyLogFile.log
引用会产生内存泄漏。如果是这样,我该怎么写这个呢?
答案 0 :(得分: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...
另外,您可能对how garbage collection works in Java感兴趣。
答案 1 :(得分:3)
你没有什么可担心的。字符串在Java中是不可变的,并且不会给你内存泄漏(至少不是你使用它们的方式)。 sbFile.toString()
每次调用它时都会创建一个新的不可变String。
答案 2 :(得分:0)
没有内存泄漏,垃圾收集器返回旧的未使用对象的重用内存。
关于File oFile
,您在代码中使用了2个不同的对象。您在此处创建的第一个对象:
File oFile = new File(sbFile.toString());
再次使用oFile引用时,旧对象在等待垃圾回收的任何地方都没有被引用。
关于StringBuilder sbFile
,只要你使用它的toString()方法,就会创建一个新的不可变String对象(Java中的String对象总是不可变的)。因此,在第二个sbFile.toString()
调用中,第二个String对象被创建,垃圾收集器可以安全地删除第一个String对象。