У меня есть 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() вызывает его.