System.in
- это "стандартный" входной поток, который поставляет пользовательские входные данные. После закрытия этот поток не может быть повторно открыт. Одним из таких примеров является использование сканера для чтения пользовательского ввода следующим образом:
public class Test {
public static void main(String[] args) {
boolean finished;
do {
Scanner inputScanner = new Scanner(System.in);
finished = inputScanner.hasNext("exit");
boolean validNumber = inputScanner.hasNextDouble();
if (validNumber) {
double number = inputScanner.nextDouble();
System.out.print(number);
} else if (!finished) {
System.out.println("Please try again.");
}
inputScanner.close();
} while (!finished);
}
}
В этом примере создается экземпляр типа Scanner
и используется для чтения серии чисел от пользователя (просьба игнорировать другие данные с помощью этого кода, выходящего за рамки этого примера, я знаю, что сканер должен быть созданный и закрытый вне цикла). После получения номера из пользовательского ввода экземпляр этого Scanner
(т.е. Входной поток) закрыт. Однако, когда другой запрос запрашивается у пользователя и создается новый экземпляр, входной поток не может быть снова открыт. В случае этого примера он создает бесконечный цикл.
Возникает вопрос: почему невозможно открыть закрытый поток?