Java 7 - 此操作的File.listFiles()成本

时间:2016-03-14 04:46:19

标签: java java-7

我有一个场景,我必须循环遍历文件内容以达到多种目的。我的问题是,多次拨打file.listFiles()是否可以?这是一项昂贵的操作吗?或者我应该将此存储到变量中并在所有位置使用它?

这里的问题是。我可能有3或4个级别。在每个级别,我必须验证或携带一些逻辑。我必须从文件夹1开始,然后执行逻辑1直到文件夹4.然后我必须从文件夹1开始执行逻辑2,然后执行逻辑3,依此类推。

Folder 1
 - Folder 2
 - File1
      - Folder 3
      - File2
           - Folder 4
           - File3

3 个答案:

答案 0 :(得分:1)

根据我的Java经验,我不认为操作成本高昂,需要时间来获取所有文件,其中n是文件数。您可以编写递归程序来读取文件夹的所有目录。递归代码将是容易写,但性能可能稍慢。

 There is no guarantee that the name strings in the resulting array will  
 appear in any specific order; they are not, in particular, guaranteed to   
  appear in alphabetical order.  

  Note that the Files class defines the newDirectoryStream method to open a 
  directory and iterate over the names of the files in the directory. This 
  may use less resources when working with very large directories.

See here

See here Also

答案 1 :(得分:0)

底线前线(BLUF):多次呼叫file.listFiles()可能会对性能造成很小影响。

我编写了一个测试用例来衡量列出本地目录内容10,000次所需的时间。我使用了2.9Ghz双核Windows 10机器。目录中有45个不同大小的文件。这是测试用例:

class Foo {

    public static void main(String[] args) {
        File f = Paths.get(System.getProperties().get("user.home")+"").toFile();
        long startTime = System.currentTimeMillis();
        for(int i = 0; i < 10000; i++){
            f.listFiles()[0].toString();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("Total Time = " + (endTime - startTime));
    }
}

它在第一次运行时产生了以下输出:

Total Time = 1337

这意味着列出文件所需的时间不到1毫秒。

答案 2 :(得分:0)

使用,

    Path searchPath = Paths.get("c://log");
    try (DirectoryStream<Path> fileList = Files.newDirectoryStream(searchPath)) {
      for (Path path : fileList) {
        System.out.println(path.getFileName());
      }

它的资源消耗较少,并为模式匹配提供了重载方法。