2012-11-19 24 views
0

我处于“旧”方式和“新”快速1.7扫描目录方式之间的两难境地。以递归方式使用FileVisitor?

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

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

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

使用可伸缩的阵列(ArrayList的)用于每个子目录肯定会伤害性能和已大内存占用,因此我需要使用常规的固定长度的数组。我一直在琢磨的另一种选择是使用可重用的主数组,并且一旦我知道了长度,就将它复制到目标数组中。然而这与递归性质冲突,以及目录和文件被交叉而不是分组的事实。我需要一个主数组,每个递归深度(可能无限),除非我可以使其先行走目录,然后文件(我的研究表明无法完成)。

回答

7

我真的会质疑这个假设:

使用每个子目录一个可扩展的阵列(ArrayList的)将 肯定伤害了性能和已经大内存占用

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

我认为(对于大多数问题来说,这种性质)您尝试一种简单的可扩展解决方案并确定任何问题,而不是事先做出假设。

+3

ArrayList的+1成本小于磁盘访问成本的1000分之一。 –