Java 8 Files.find示例代码(FindDemo)运行异常求助
排查Java 8 Files.find()代码无法运行的问题
我来帮你拆解这段代码里的几个关键问题,调整后就能正常运行啦:
核心问题1:Stream惰性求值导致逻辑未执行
Files.find()返回的是Stream<Path>,而Java 8的Stream是惰性求值的——简单说就是,只有调用终端操作(比如forEach()、collect())时,整个查找逻辑才会真正执行。你现在的代码只是创建了Stream,但没触发它的执行,所以控制台没有任何输出,看起来像“没运行”。
核心问题2:路径判断逻辑错误
你用String.valueOf(path).equals("home")判断路径,但path是绝对路径(比如根目录下的home路径是/home),这个字符串永远不会等于"home"。正确的做法是获取路径的文件名部分来比较。
额外遗漏:缺少程序入口方法
你的代码里没有main方法,就算修正了前面的问题,也没法直接运行这个类。
修正后的完整代码
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.BasicFileAttributes; public class FindDemo { public void showDemo() { System.out.println("=== Files.find() demo ==="); try { // 添加终端操作forEach()触发Stream执行 Files.find(Paths.get("/"), 3, (path, attributes) -> { // 获取文件名判断,同时增加判空避免空指针 if (path.getFileName() != null && path.getFileName().toString().equals("home")) { System.out.println("FOUND : " + path); return true; } System.out.println("\tNOT VALID : " + path); return false; }).forEach(path -> {}); // 终端操作,触发整个流的执行 } catch (IOException e) { System.err.println("遍历遇到权限或IO问题:" + e.getMessage()); e.printStackTrace(); } } // 添加main方法作为程序入口 public static void main(String[] args) { new FindDemo().showDemo(); } }
关键修正说明
- 新增
forEach(path -> {})终端操作,触发Stream的实际执行; - 改用
path.getFileName().toString()获取文件名进行比较,匹配逻辑正确; - 增加
path.getFileName() != null判空,避免根目录路径触发空指针异常; - 添加
main方法,让类可以直接运行。
内容的提问来源于stack exchange,提问作者Daniyar Serikov
相关产品推荐
相关产品推荐

