我在'旧'方式和'新'更快的1.7方式扫描目录之间处于两难境地。
我需要扫描驱动器上的所有目录并构建类似的树结构。在1.6中没有问题(除了它慢了10倍),但是使用FileFisitor我有一些很大的障碍。
我如何预先知道目录包含多少项(文件+子目录)?
File[] files = path.listFiles();
和files.length
就是答案。public FileVisitResult preVisitDirectory(Path path, BasicFileAttributes bfa){}
中,计数在哪里?对每个子目录使用可伸缩数组(ArrayList)肯定会损害性能和已经很大的内存占用,因此我需要使用常规的固定长度数组。我一直在思考的另一种方法是使用可重用的主数组,一旦我知道了长度,就将其复制到目标数组。然而,这与递归性质以及目录和文件交错而不是分组的事实相冲突。我需要一个主数组用于每个递归深度(可能是无限的),除非我可以首先使它成为walk目录,然后是文件(我的研究说不能这样做。)
答案 0 :(得分:7)
我真的会质疑这个假设:
为每个子目录使用可伸缩数组(ArrayList) 肯定会伤害性能和已经很大的内存 足迹
你有什么依据?请注意,您的性能可能会受到访问文件系统的速度的限制(或至少受到影响)。
我认为(就大多数问题而言,这种性质)你尝试一个简单的可扩展解决方案,并确定任何真实问题,而不是提前做出假设。