如果您唯一关心的是不创建List<File>
,则可以使用Stream API
。
long count = Files.list(Paths.get(path))
.filter(p -> p.toFile().isFile())
.count();
System.out.println("count = " + count);
Run Code Online (Sandbox Code Playgroud)
编辑该片段并不意味着很快。仅提供了不使用list()
或的要求listFiles()
。;-)
对包含200万个文件的目录中文件数量的计数方法进行了比较。
所有命令执行两次。第一次执行是使用已删除的文件缓存,第二次执行是紧随第一个之后。
| ls | dir.list() | dir.listFiles() | Files.list(path)
--------------+-------+------------+-----------------+------------------
dropped cache | 9,120 | 5,518 | 5,879 | 59,175
filled cache | 946 | 1,992 | 2,401 | 51,179
Run Code Online (Sandbox Code Playgroud)
以毫秒为单位的时间(逗号是千位分隔符)
下面是已执行命令的详细信息。
ls
ls -f /tmp/huge-dir | wc -l
Run Code Online (Sandbox Code Playgroud)
dir.list()
File hugeDir = new File("/tmp/huge-dir");
int numberFiles = hugeDir.list().length;
Run Code Online (Sandbox Code Playgroud)
dir.listFile()
File hugeDir = new File("/tmp/huge-dir");
int numberFiles = hugeDir.listFiles().length;
Run Code Online (Sandbox Code Playgroud)
Files.list(路径)
Path path = Paths.get("/tmp/huge-dir");
long numberFiles = Files.list(path)
.filter(p -> p.toFile().isFile())
.count();
Run Code Online (Sandbox Code Playgroud)
根据这些数字。使用dir.list().length
似乎不是一个糟糕的解决方案。