Должен ли поставщик использоваться для подачи файлового потока?

Мне нужно было предоставить Stream файла более одного раза, чтобы различные операции могли выполняться с ним в разное время, я использовал следующий поставщик:

Supplier<Stream<String>> linesSupplier = () -> {
    try
    {
        return Files.lines(Paths.get(file.toURI()));
    }
    catch (IOException e)
    {
        log.error("Error while supplying file " + file.getName(), e);
    }
    return null;
};

К сожалению, это приводит к утечке дескриптора файла, поэтому я попытался использовать метод try-with-resource, как было предложено.

Supplier<Stream<String>> linesSupplier = () -> {
    try(Stream<String> lines = Files.lines(Paths.get(file.toURI())))
    {
        return lines;
    }
    catch (IOException e)
    {
        log.error("Error while supplying file " + file.getName(), e);
    }
    return null;
};

Но сейчас я впервые использую linesSupplier.get() Я получаю java.lang.IllegalStateException,

Это признак того, что я должен стараться активно избегать Supplier какими бы ни были обстоятельства?

1 ответ

Решение

Конечно нет - вы должны использовать Supplier когда вам нужно. Проблема здесь в том, что Stream реализует класс AutoCloseable и ваш try-with-resource называет это close метод после того, как он заканчивается.

Таким образом, нужно либо сделать Supplier ответственность за закрытие Stream перемещая try-with-resource или можно вернуть что-то еще как Streamнапример, List<String>,

Другие вопросы по тегам