我在“旧”方式和“新”更快的 1.7 扫描目录方式之间进退两难。
我需要扫描驱动器上的所有目录并构建类似的树结构。在 1.6 中没有问题(除了慢了 10 倍),但使用 FileFisitor 我有一些大障碍。
我如何事先知道一个目录包含多少项(文件+子目录)?
- 老办法:
File[] files = path.listFiles();
就是files.length
答案。 - 新方法:在回调函数
public FileVisitResult preVisitDirectory(Path path, BasicFileAttributes bfa){}
中,计数在哪里?
为每个子目录使用可伸缩数组(ArrayList)肯定会损害性能和已经很大的内存占用,因此我需要使用常规的固定长度数组。我一直在思考的另一种方法是使用可重用的主数组,一旦我知道长度,将其复制到目标数组。然而,这与递归性质以及目录和文件交错而不是分组的事实相冲突。对于每个递归深度(可能是无限的),我都需要一个主数组,除非我可以让它先遍历目录,然后是文件(我的研究表明无法完成。)