【发布时间】:2014-04-03 00:20:34
【问题描述】:
我不想使用传统的方法为每个我想要检查是否存在的路径名(文件/目录)创建一个新的文件对象。例如在下面的代码中:
public class FileChecker {
public static void main(String args[]) {
File f1 = new File("home/usr/data1");
File f2 = new File("home/usr/data2")
if(f1.exists()){
System.out.println("File existed");
}else{
System.out.println("File not found!");
}
if(f2.exists()){
System.out.println("File existed");
}else{
System.out.println("File not found!");
}
}
}
我必须为我要检查其存在的每个候选文件创建一个新对象,我认为如果我的文件列表(需要检查是否存在很大),这种方法将单调地填充堆空间。有没有其他方法可以在不创建这么多 File 对象的情况下实现相同的目标?
【问题讨论】:
-
没有。您可以列出目录中的所有文件,但最终仍会得到大量
File对象。为什么要担心堆栈空间? -
嗯,检查应该是一种方法而不是内联代码(任何时候你开始一遍又一遍地写同样的东西——这是一个死的赠品,它应该是一种方法)。除了创建
File对象外,我无法检查文件是否存在。而且,如果您将其设置为一次只检查一个文件的方法,则由于垃圾回收,它不会填满堆(这是所有File对象所在的位置,而不是堆栈)。跨度> -
对象创建成本低,GC 的设计假设很多对象都是短暂的。如果您真的认为这是一个问题,那么在您花时间尝试改进它之前,先使用分析器对其进行测量 - 您几乎肯定会发现这不值得。
-
@IanRoberts OP 询问堆栈,而不是堆。所以垃圾收集不是问题。这只是方法中变量的数量。当然,使用数组或某种集合可以解决这个问题。所以会循环执行。
-
除非代码是自动生成的,否则我看不出在这种情况下如何编写足够的代码来为堆栈制造问题。
标签: java