【问题标题】:checking existence of file/directory without creating new File object在不创建新文件对象的情况下检查文件/目录的存在
【发布时间】: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


【解决方案1】:

如果您知道要检查文件的文件夹,这里有一种方法可以找到文件的存在,而无需创建这么多 File 对象 -

File folder = new File("<directory_name>");
ArrayList<String> fileNames = new ArrayList<String>(Arrays.asList(folder.list()));
fileNames.contains("my file");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多