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
のインスタンス(すなわち、入力ストリーム)は閉じられる。ただし、別の番号がユーザーから要求され、新しいインスタンスが作成されると、入力ストリームを再び開くことができません。この例の場合、無限ループを作成します。
質問です:なぜ、閉じたストリームを再開することができないのですか?
そのリソースはすでにオペレーティングシステムにリリースされているためです。なぜあなたはスキャナを開き、ループの外でそれを閉じていないのですか? – RealSkeptic
私はあなたの[前の質問](http://stackoverflow.com/questions/33552505/scanner-continuous-loop)にリンクします。両方の質問は重複していません。なぜなら、最初の質問は「各繰り返し後にスキャナがブロックされない理由」だったからです。しかし、今後の読者には、なぜ「クローズドストリームを再開できないのか」という質問についての有益なヒントや説明があります。 – Frakcool