У меня есть Scanner связанный с System.in. Теперь, после использования Scanner, я должен закрыть его, поскольку оставлять его открытым - плохая практика кодирования. Но, если я закрою Scanner, я тоже закроюсь System.in! Кто-нибудь может сказать мне, как я могу закрыть Scanner без закрытия System.in (если есть какой-либо способ).
Переведено автоматически
Ответ 1
Самое простое - не закрывать сканер, если вы не хотите закрывать базовый поток.
В идеале вам следует создать только один сканер, который вы будете использовать на протяжении всего срока службы программы. В любом случае, похоже, у вас нет веских причин закрывать его.
Ответ 2
Один из вариантов - обернуть ваш System.in поток в CloseShieldInputStream, который предотвращает его закрытие. Тогда ваш читатель будет использовать CloseShieldInputStream а не необработанный System.in поток.
Вместо добавления классов shield и тому подобного, просто добавьте хороший комментарий и
@SuppressWarnings("resource")
Этого достаточно. И, кажется, я не вижу особых недостатков в этом подходе. Не забудьте комментарий.
Ответ 4
У меня сохранились смутные воспоминания о странных, недиагностируемых проблемах давным-давно, связанных с использованием одного и того же Scanner из System.in дважды, так что это то, что я использую (хотя вам, вероятно, следует использовать только один сканер на время работы программы):
По какой-то причине это работает без предупреждений, тогда как, если я не выполню перехват, Eclipse будет жаловатьсяResource leak: '<unassigned Closeable value>' is never closed.