Вопрос-ответ

Close a Scanner linked to System.in

Закройте сканер, связанный с System.in

У меня есть Scanner связанный с System.in. Теперь, после использования Scanner, я должен закрыть его, поскольку оставлять его открытым - плохая практика кодирования. Но, если я закрою Scanner, я тоже закроюсь System.in! Кто-нибудь может сказать мне, как я могу закрыть Scanner без закрытия System.in (если есть какой-либо способ).

Переведено автоматически
Ответ 1

Самое простое - не закрывать сканер, если вы не хотите закрывать базовый поток.

В идеале вам следует создать только один сканер, который вы будете использовать на протяжении всего срока службы программы. В любом случае, похоже, у вас нет веских причин закрывать его.

Ответ 2

Один из вариантов - обернуть ваш System.in поток в CloseShieldInputStream, который предотвращает его закрытие. Тогда ваш читатель будет использовать CloseShieldInputStream а не необработанный System.in поток.

Вот API для класса: http://commons.apache.org/io/apidocs/org/apache/commons/io/input/CloseShieldInputStream.html

Ответ 3

Вместо добавления классов shield и тому подобного, просто добавьте хороший комментарий и

        @SuppressWarnings("resource")

Этого достаточно. И, кажется, я не вижу особых недостатков в этом подходе. Не забудьте комментарий.

Ответ 4

У меня сохранились смутные воспоминания о странных, недиагностируемых проблемах давным-давно, связанных с использованием одного и того же Scanner из System.in дважды, так что это то, что я использую (хотя вам, вероятно, следует использовать только один сканер на время работы программы):

static String input() {
try {
return new Scanner(System.in).nextLine();
} catch (NoSuchElementException e) {
throw e;
}
}

По какой-то причине это работает без предупреждений, тогда как, если я не выполню перехват, Eclipse будет жаловатьсяResource leak: '<unassigned Closeable value>' is never closed.

java