当前位置: 首页 > 知识库问答 >
问题:

Java8:处理文件的供应商抛出“流已经被操作或关闭”

古棋
2023-03-14
java.lang.IllegalStateException: stream has already been operated upon or closed
  • java-stream已被操作或关闭

供应商合作可以解决此问题。

所以我当前的代码如下:

    try (Stream<String> stream =  Files.lines(Paths.get(fileName)) ) {

        Supplier<Stream<String>> supplier = () -> stream;

        logger.info("A");
        logger.info("ABC {}", supplier.get().findFirst().get());
        logger.info("B");
        logger.info("XYZ {}", supplier.get().skip(1050).findFirst().get());
        logger.info("C");

        assertThat(supplier.get().count(), is(1051));

    }
    catch (IOException e) {
        logger.error("{}", e.getMessage());
    }
   try (Stream<String> stream =  Files.lines(Paths.get(fileName)) ) {

        Supplier<Stream<String>> supplier = () -> stream.collect(Collectors.toList()).stream();

        logger.info("A");
        logger.info("ABC {}", supplier.get().findFirst().get());
        logger.info("B");
        logger.info("XYZ {}", supplier.get().skip(1050).findFirst().get());
        logger.info("C");

        assertThat(supplier.get().count(), is(1051));

    }

相同的错误信息。

共有1个答案

年业
2023-03-14

供应商并不神奇,您仍然需要一直从该供应商提供一个新的流。

所以你可以做:

Supplier<Stream<String>> supplier = () -> Files.lines(Paths.get(fileName));

但这意味着要一直阅读文件。您可以将所有行读入单个列表,将其存储在内存中,并将其存储在中。

List<String> allLines = Files.readAllLines(Paths.get(fileName));

Supplier<Stream<String>> supplier = () -> allLines.stream();
 Supplier<Stream<String>> streamSupplier = () -> Stream.of(array);
 类似资料:
  • 即使我在我的流中使用Supplier并在每次我想检索我的strem并对其执行终端操作时使用Supplier.get(),我仍然得到“Stream已经被操作或关闭”异常。有人能看看我的代码并建议我做错了什么吗? 引发异常的方法: 流供应商:

  • 方法是 现在我试着像这样改成stream,但我不知道这种改是否正确: 如何避免出现例外,解决问题? 我应该以某种方式重构代码吗?

  • 据我所知,如果您使用供应商,您可以通过在供应商上使用get()func来随时使用流。我仍然得到“流已经被操作或关闭”。 请帮助我理解,是否有任何限制使用流通过供应商以及??

  • 问题内容: 我正在尝试使用Stream API生成Order实例。我有一个创建订单的工厂函数,并且使用DoubleStream初始化订单金额。 如果我使用文字(1.0)初始化Order实例,则可以正常工作。当我使用doubleStream创建随机数量时,将引发异常。 问题答案: 答案在(重点是我的)的javadoc中: 流仅应操作一次(调用中间流或终端流操作) 。例如,这排除了“分叉”流,其中相同