以递归方式使用FileVisitor?

时间:2012-11-19 10:40:37

标签: java performance filesystems java-7

我在'旧'方式和'新'更快的1.7方式扫描目录之间处于两难境地。

我需要扫描驱动器上的所有目录并构建类似的树结构。在1.6中没有问题(除了它慢了10倍),但是使用FileFisitor我有一些很大的障碍。

我如何预先知道目录包含多少项(文件+子目录)?

  • 旧方式:File[] files = path.listFiles();files.length就是答案。
  • 新方式:在回调函数public FileVisitResult preVisitDirectory(Path path, BasicFileAttributes bfa){}中,计数在哪里?

每个子目录使用可伸缩数组(ArrayList)肯定会损害性能和已经很大的内存占用,因此我需要使用常规的固定长度数组。我一直在思考的另一种方法是使用可重用的主数组,一旦我知道了长度,就将其复制到目标数组。然而,这与递归性质以及目录和文件交错而不是分组的事实相冲突。我需要一个主数组用于每个递归深度(可能是无限的),除非我可以首先使它成为walk目录,然后是文件(我的研究说不能这样做。)

1 个答案:

答案 0 :(得分:7)

我真的会质疑这个假设:

  

为每个子目录使用可伸缩数组(ArrayList)   肯定会伤害性能和已经很大的内存   足迹

你有什么依据?请注意,您的性能可能会受到访问文件系统的速度的限制(或至少受到影响)。

我认为(就大多数问题而言,这种性质)你尝试一个简单的可扩展解决方案,并确定任何真实问题,而不是提前做出假设。