Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Проще всего не закрывать сканер, если вы не хотите закрывать базовый поток.

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

Ответ 3

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

        @SuppressWarnings("resource")

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

Ответ 4

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

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

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

Ответ 5

В соответствии с API для InputSteam "Метод закрытия InputStream ничего не делает", так как System.in является экземпляром InputStream, вам не нужно беспокоиться о том, что вызов close() вызывает его.