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