You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 03:46:22