我有一个场景,我必须循环遍历文件内容以达到多种目的。我的问题是,多次拨打file.listFiles()
是否可以?这是一项昂贵的操作吗?或者我应该将此存储到变量中并在所有位置使用它?
这里的问题是。我可能有3或4个级别。在每个级别,我必须验证或携带一些逻辑。我必须从文件夹1开始,然后执行逻辑1直到文件夹4.然后我必须从文件夹1开始执行逻辑2,然后执行逻辑3,依此类推。
Folder 1
- Folder 2
- File1
- Folder 3
- File2
- Folder 4
- File3
答案 0 :(得分:1)
根据我的Java经验,我不认为操作成本高昂,需要时间来获取所有文件,其中n是文件数。您可以编写递归程序来读取文件夹的所有目录。递归代码将是容易写,但性能可能稍慢。
There is no guarantee that the name strings in the resulting array will
appear in any specific order; they are not, in particular, guaranteed to
appear in alphabetical order.
Note that the Files class defines the newDirectoryStream method to open a
directory and iterate over the names of the files in the directory. This
may use less resources when working with very large directories.
答案 1 :(得分:0)
底线前线(BLUF):多次呼叫file.listFiles()
可能会对性能造成很小影响。
我编写了一个测试用例来衡量列出本地目录内容10,000次所需的时间。我使用了2.9Ghz双核Windows 10机器。目录中有45个不同大小的文件。这是测试用例:
class Foo {
public static void main(String[] args) {
File f = Paths.get(System.getProperties().get("user.home")+"").toFile();
long startTime = System.currentTimeMillis();
for(int i = 0; i < 10000; i++){
f.listFiles()[0].toString();
}
long endTime = System.currentTimeMillis();
System.out.println("Total Time = " + (endTime - startTime));
}
}
它在第一次运行时产生了以下输出:
Total Time = 1337
这意味着列出文件所需的时间不到1毫秒。
答案 2 :(得分:0)
使用,
Path searchPath = Paths.get("c://log");
try (DirectoryStream<Path> fileList = Files.newDirectoryStream(searchPath)) {
for (Path path : fileList) {
System.out.println(path.getFileName());
}
它的资源消耗较少,并为模式匹配提供了重载方法。