【问题标题】:stream has already been operated upon or closed, gained exception when trying to create Racers流已被操作或关闭,尝试创建 Racers 时出现异常
【发布时间】:2019-12-23 04:56:42
【问题描述】:

我有以下课程:

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);

创建包含在同一类中的赛车手的方法:

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 的信息,但我无法理解,因此我将不胜感激如何修复我的程序。

【问题讨论】:

    标签: java java-8 java-stream


    【解决方案1】:

    您正在使用try-with-resources 语句来创建流。因此,当方法返回时,流将被关闭,这违背了您的目的。

    来自上述资源(强调我的

    try-with-resources 语句是声明一个或多个资源的 try 语句。资源是程序完成后必须关闭的对象。 try-with-resources 语句确保每个资源都在语句结束时关闭。任何实现 java.lang.AutoCloseable 的对象,包括所有实现 java.io.Closeable 的对象,都可以用作资源。

    Stream 扩展 BaseStream 扩展 AutoCloseable


    更改您的代码以返回类似的流

    public Stream<String> createStreamFromFile(String file) throws IOException {
        return Files.lines(Paths.get(file));
    }
    

    【讨论】:

    • @HadiJ 不,它不能。你可以说得更详细点吗?如果找不到文件,它仍然可以抛出IOException
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多