Невозможно повторно открыть System.in
, System.out
или System.err
. Основными исходными потоками являются файловые дескрипторы, подключенные к другим процессам или файлы, чья личность не может распознать ваше приложение. После того, как базовые дескрипторы файла будут закрыты, их невозможно повторно открыть.
Лучшее, что я могу предложить, это создать оболочку InputStream
класса для объекта System.in
и кодировать оболочку для обработки close()
как нет-op. Или, возможно, установить оболочку в «закрытое» состояние без фактического закрытия обернутого потока.
В вашем конкретном прецеденте это не будет работать, потому что вам нужно «разблокировать поток, который заблокирован при чтении с System.in
. Поэтому в вашем случае вам нужно будет делать неблокирующий ввод от System.in
. Например, используйте метод available()
, чтобы проверить, есть ли какие-либо символы для чтения с консоли. (Обычно можно с уверенностью предположить, что если available()
вернет число, большее нуля, вы сможете прочитать всю строку.)
(Он также может реализовать неблокирующие чтения с помощью Selector
, но я не знаю «т думаю, что можно получить„выбираемый канал“для System.in
объекта.)
Обратите внимание, что Thread.interrupt()
не будет работать. Согласно javadocs, он будет работать, только если вы читаете с прерывистого канала.
System.in не является прерываемой канал, и
, если он был, то документально поведение для interrupt()
является то, что канал закрывается прерыванием.
я думаю, что его нет. – Secondo
Можно утверждать, что [вы никогда не должны закрывать 'System.in', поскольку вы его не открыли] (http://stackoverflow.com/a/7457737/545127). – Raedwald