调用Files.write时抛出IllegalStateException的问题排查
问题原因
你代码的核心问题是Stream被提前关闭:
find()方法里用try-with-resources包裹了Files.walk返回的Stream<Path>,这个语法会在try代码块执行完毕(也就是方法返回时)自动关闭Stream。- 当你在
writeAllTxtSorted中调用find().sorted()::iterator时,返回的Stream已经处于关闭状态,此时尝试迭代它就会抛出IllegalStateException。
修复方案
推荐两种可行的修复方式:
方式一:在find()中直接收集结果(更安全)
把Stream转换为List后返回,彻底避免Stream生命周期问题:
private static void writeAllTxtSorted(String fileId) { try { Path file = tmp.resolve("AllTxt" + fileId); Files.deleteIfExists(file); Files.write(file, find(), StandardOpenOption.CREATE); } catch (Exception e) { err(e, "problems", l); } } static List<String> find() throws IOException { try (Stream<Path> walk = Files.walk(Path.of("C:/Temp"))) { return walk.map(Path::toString) .sorted() .collect(Collectors.toList()); } }
方式二:让调用方管理Stream生命周期(需注意资源关闭)
如果必须返回Stream,就去掉find()里的try-with-resources,由调用方负责关闭资源:
private static void writeAllTxtSorted(String fileId) { try (Stream<String> paths = find()) { Path file = tmp.resolve("AllTxt" + fileId); Files.deleteIfExists(file); Files.write(file, paths.sorted()::iterator, StandardOpenOption.CREATE); } catch (Exception e) { err(e, "problems", l); } } static Stream<String> find() throws IOException { return Files.walk(Path.of("C:/Temp")) .map(Path::toString); }
这种方式必须确保调用方用try-with-resources包裹Stream,防止资源泄漏。
内容的提问来源于stack exchange,提问作者ngong
相关产品推荐
相关产品推荐

