Хорошо, это, вероятно, не лучший вопрос, но я застрял на нем и не могу найти ответа на него в сети.
Этот код не будет считываться со стандартного ввода второй раз:
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in)))
{
input = br.readLine();
}
catch (final Exception e)
{
System.err.println("Read from STDIN failed: " + e.getMessage());
}
// do some processing
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in)))
{
input = br.readLine();
}
catch (final Exception e)
{
System.err.println("Read from STDIN failed: " + e.getMessage());
}
Я знаю, что java try-with-resources рекурсивно закрывает все потоки в цепочке, поэтому после первого чтения System.in
закрывается. Есть ли какое-нибудь хорошее решение для этого? Или мне действительно нужно самому заниматься закрытием потока?
upd: Я сам пытался обработать закрытие потока (то есть в стиле java6). Вот код, если кому-то интересно. Но я заметил, что такое закрытие цепочки происходит не из-за попытки с ресурсами, а из-за реализации закрытых методов. Так что я ничего не выиграл от этой попытки.
Я выбираю решение fge, потому что оно наиболее подробное. Это сработало для меня напрямую.
В целом, мне кажется довольно странным, что в java нет такого решения из коробки, поскольку есть системные потоки, которые не следует закрывать.
InputStream
класс, который не будет закрывать базовые ресурсы на.close()
; хотя это нарушает.close()
контракт - person fge   schedule 13.04.2014