以递归方式使用FileVisitor?

Mar*_*mus 0 java filesystems performance java-7

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

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

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

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

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

Bri*_*new 7

我真的会质疑这个假设:

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

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

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

  • ArrayList的+1成本低于磁盘访问成本的1000. (3认同)