Должен ли поставщик использоваться для подачи файлового потока?
Мне нужно было предоставить 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>
,