光阴似箭催人老,日月如移越少年。
最初の質問は、2 つのコードの違いはブロック位置であるということです。出力コードの行を追加すると、その違いが明確にわかります。
テスト.java
import java.util.Scanner; パブリック クラス テスト { public static void main(String[] args) { スキャナー s = 新しいスキャナー(System.in); while(s.hasNext()) { System.out.print("入力した内容: "); System.out.println(s.next()); } } }
さらに、hasNext() メソッドはブロックしますが、next() メソッドがブロックしないという意味ではありません。
/** * このスキャナーの入力に別のトークンがある場合は true を返します。 * このメソッドは、スキャンへの入力を待機している間にブロックされる可能性があります。 * スキャナは入力を超えて進みません。 * * このスキャナーが別のトークンを持っている場合に限り、 @return true * このスキャナーが閉じている場合は @throws IllegalStateException * @java.util.Iterator を参照 */ public boolean hasNext() { ensureOpen(); saveState(); while (!sourceClosed) { if (hasTokenInBuffer()) 戻り値revertState(true); readInput(); } ブール値の結果 = hasTokenInBuffer(); returnrevertState(結果); }
/** * このスキャナーから次の完全なトークンを検索して返します。 * 完全なトークンの前後には、一致する入力が続きます。 * 区切り文字パターン。このメソッドは入力の待機中にブロックされる可能性があります。 * 以前の {@link #hasNext} の呼び出しが返した場合でもスキャンします * <code>true</code>。 * * @return 次のトークン * 利用可能なトークンがない場合は @throws NoSuchElementException * このスキャナーが閉じている場合は @throws IllegalStateException * @java.util.Iterator を参照 */ public String next() { ensureOpen(); クリアキャッシュ while (true) { 文字列トークン = getCompleteTokenInBuffer(null); if (トークン != null) { マッチ有効 = true; スキップ = false; トークンを返す。 } if(入力が必要) readInput(); それ以外 throwFor(); } }
2 番目の質問です。ループを終了するには、Windows 環境では Ctrl+Z を入力する必要があります。Unix 環境では Ctrl+D を入力する必要があります。これは入力であり、コンソールの操作ではないことに注意してください。これは、EOF を表す文字をコンソールに入力するのと同じであり、この時点で、hasNext() メソッドは false を返し、ループが終了します。
ブロック位置が異なります
最初の質問は、2 つのコードの違いはブロック位置であるということです。出力コードの行を追加すると、その違いが明確にわかります。
テスト.java
さらに、hasNext() メソッドはブロックしますが、next() メソッドがブロックしないという意味ではありません。
2 番目の質問です。ループを終了するには、Windows 環境では Ctrl+Z を入力する必要があります。Unix 環境では Ctrl+D を入力する必要があります。これは入力であり、コンソールの操作ではないことに注意してください。これは、EOF を表す文字をコンソールに入力するのと同じであり、この時点で、hasNext() メソッドは false を返し、ループが終了します。
ブロック位置が異なります