流已经被操作或关闭,尝试创建Racers时获得了异常

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了流已经被操作或关闭,尝试创建Racers时获得了异常相关的知识,希望对你有一定的参考价值。

我有以下课程:

public List<Racer> createListOfRacers() throws IOException {
    Stream<String> abbreviationsOfRacers = fileLoader.createStreamFromFile("src/main/resources/abbreviations.txt");

    Stream<Racer> racerList = abbreviationsOfRacers
            .map(this::createRacer);

    return racerList.collect(toList());
}

在此行中引发异常:

.map(this::createRacer);

创建包含在同一类中的Racer的方法:

private Racer createRacer(String line) {
    return new Racer(extractAbbreviationOfTheRacer(line), extractNameOfTheRacer(line), extractTeamOfTheRacer(line));
}

private String extractNameOfTheRacer(String line) {
    return line.substring(line.indexOf('_') + 1, line.lastIndexOf('_'));
}

private String extractTeamOfTheRacer(String line) {
    return line.substring(line.lastIndexOf('_') + 1);
}

private String extractAbbreviationOfTheRacer(String line) {
    return line.substring(0, line.indexOf('_'));
}

赛车手类:

public class Racer {

    private String abbrevition;
    private String name;
    private String team;
    private String result;


    public Racer(String abbrevition, String name, String team) {
        this.abbrevition = abbrevition;
        this.name = name;
        this.team = team;
    }

    public Racer() {
    }

Abbreviations.txt文件:

DRR_Daniel Ricciardo_RED BULL RACING TAG HEUER
SVF_Sebastian Vettel_FERRARI
LHM_Lewis Hamilton_MERCEDES
KRF_Kimi Raikkonen_FERRARI ...

FileLoader类:

public Stream<String> createStreamFromFile(String file) throws IOException {

    try (Stream<String> streamFromFile = Files.lines(Paths.get(file))) {

        return streamFromFile;
    }

}

我阅读了有关Stream Supplier的信息,但无法弄清楚,因此,感谢您提供有关如何修复程序的帮助。

答案
您正在使用try-with-resources语句创建流。因此,当方法返回时,流将被关闭,这将达到您的目的。
另一答案
流只能操作/作用一次。您不应该重用流。我看不到有方法createStreamFromFile返回给定文件的行流的任何意义。此外,流API是一种流畅的API,您可以创建处理管道,而不必声明容易出错的中间变量,例如Stream<Racer> racerList。上面给出的答案(即被接受的答案)在使用完文件资源后不会关闭它,因此会导致资源泄漏。您必须在try-with-resources ARM块内声明Files.lines(Paths.get(file)),然后在该块内进行处理。退出块时,打开的资源将自动关闭。所以,这是成语。

以上是关于流已经被操作或关闭,尝试创建Racers时获得了异常的主要内容,如果未能解决你的问题,请参考以下文章

如何防止值被移动?

java中IO流操作怎样关闭流

C++ Primer--第二章知识点总结(待续)

java:关闭子进程标准流?

PHP Websocket客户端[关闭]

使用 PHP 打开或创建文件时权限被拒绝