Не совсем новый ответ на этот вопрос, но я хотел прояснить путаницу в комментариях о том, почему исходный код вел себя так, как он (я не могу комментировать, потому что я новичок в ST и не набрал репутацию точек).
Нулевой результат не имеет ничего общего с сборкой мусора. Следующая программа постигла та же участь, хотя оба читателя все еще живут, доступные объекты:
BufferedReader r1 = new BufferedReader(new InputStreamReader(System.in));
System.out.println(r1.readLine());
BufferedReader r2 = new BufferedReader(new InputStreamReader(System.in));
System.out.println(r2.readLine());
Все сводится к тому, что означает «Буферизованный» в BufferedReader
. Это Reader
, который включает внутреннюю буферизацию. Внутренняя буферизация обычно значительно повышает эффективность операций в основном потоке, например пытаясь каждый раз прочитать значение полного буфера, вместо того, чтобы «потрубить поток» до смерти, получая несколько байтов здесь и несколько там.
Так что же происходит, когда вы создаете первый BufferedReader
на stdin и читаете из него строку? BufferedReader
читает полный буфер из потока, обнаруживает конец строки, возвращает первую строку и вешает остаток буфера, чтобы заполнить свой следующий запрос. Это оставляет основной поток, расположенный за концом этой первой строки. И если ваш ввод небольшой, его можно легко расположить на EOF.
Итак, теперь вы идете и создаете второй BufferedReader поверх того же потока - который находится в EOF - и пытаетесь получить строку. Второй BufferedReader пытается прочитать из базового потока и обнаруживает EOF, поэтому readLine
возвращает null
.