Java.nio Files.walk()Java 8列出并统计所有文件和目录
在Java.nio包中使用Java8Java.nio Files.walk()Java 8列出并统计所有文件和目录,java,foreach,stream,Java,Foreach,Stream,在Java.nio包中使用Java8Files.walk()Java8方法将列出所有文件和目录。有没有办法计算文件和目录的数量 我有一个使用File和isDirectory()的解决方案,但我想尝试使用Files.walk获得相同的结果 这个样品运行良好 import java.io.IOException; import java.nio.file.*; import java.util.stream.Stream; public class Java8ListFilesInDirector
Files.walk()
Java8方法将列出所有文件和目录。有没有办法计算文件和目录的数量
我有一个使用File和isDirectory()的解决方案,但我想尝试使用Files.walk获得相同的结果
这个样品运行良好
import java.io.IOException;
import java.nio.file.*;
import java.util.stream.Stream;
public class Java8ListFilesInDirectory
{
public static void main(String[] args) throws IOException
{
Stream<Path> files = Files.walk(Paths.get("C:\\temp"));
files.forEach(System.out::println);
files.close();
}
}
import java.io.IOException;
导入java.nio.file.*;
导入java.util.stream.stream;
公共类Java8ListFilesInDirectory
{
公共静态void main(字符串[]args)引发IOException
{
流文件=文件.walk(路径.get(“C:\\temp”);
files.forEach(System.out::println);
close();
}
}
但是,我也要计算文件/目录,并且已经尝试过了
{
int dirCount = 0;
Stream<Path> files = Files.walk(Paths.get("C:\\temp"));
files.forEach(System.out::println);
files.forEach(dirCount++);
files.close();
}
{
int dirCount=0;
流文件=文件.walk(路径.get(“C:\\temp”);
files.forEach(System.out::println);
forEach(dirCount++);
close();
}
但是java类无法使用
错误:不兼容的类型:int无法转换为使用者文件
TLDR
long dirCount = files.peek(System.out::println).count();
long dirCount = files.peek(System.out::println).count();
forEach
方法需要一个Consumer
作为其参数:
void forEach(Consumer<? super T> action);
System.out::println
能够满足合同要求,定义如下:
void println(Object obj);
在第二个示例中,您没有提供能够满足参数的表达式,它只是一个语句。您可能会想“好吧,我将使用满足合同要求的lambda来执行此操作”,但这也会有错误:
files.forEach(file -> dirCount++);
// Fails to compile because dirCount is not final
对于要从外部作用域在lambda内部使用的对象,它必须是final,这意味着您不能更改变量指向的引用或原语值。另一个问题是,您只能在流中迭代一次。只要您遍历它,它就会是空的
鉴于这个问题,我将使用peek
和count
来解决这个问题。您可以使用peek
在每个项目通过流并将值发送给下一个操作员时执行操作。在此之后,count
将评估流中有多少项(使用流执行此操作):
files.forEach(file -> dirCount++);
// Fails to compile because dirCount is not final
long dirCount = files.peek(System.out::println).count();