5

Scannerオブジェクトを介してコマンドを読み取ろうとしています。私が使用する入力構文を確認するためsc.hasNext()(コマンドが欠落している場合)。すでに多くのケースで問題なく動作していましたが、JavaAPI で「MAY ブロックして入力を待機する」と記述されているケースがあります。

メソッドはいつhasNext()ブロックされ、どのように制御できますか? 面白いことに、ブロックの前に 3 つのケースがあれば問題なく動作します。また、JavaAPI はhasNext()、メソッドnext()Exception.

これまでに作成したコードは次のとおりです。

if (sc.hasNext() && sc.next().equals("create")) {
    if (sc.hasNextInt()) {
        width = sc.nextInt();
        if (width > 0) {
            if (sc.hasNextInt()) {
                heigth = sc.nextInt();
                if (heigth > 0) {
                    if (sc.hasNext()) {  //At this point the hasNext Statement blocks for //no reason till an Input is made.
                        charset = sc.next();
                        Image = new AsciiImage(width, heigth,charset);
                    } else {
                        ret = false;
                        System.out.println("INPUT MISMATCH");
                    }
                } ...//and so on

前もってありがとう、私はこのトピックで私自身のものを見つけることができませんでした. 編集: スキャナーは System.in として定義されていますが、それは問題ではないはずです。少なくとも今まではそうではありませんでした。

4

3 に答える 3

9

Console 経由のテストと TextFile 経由のテストには違いがあります。コンソールから読み取ると、プログラムはストリームを期待し、さらに入力を待ちます。

Textfile からの入力を介してテストする場合 (スキャナー用に System.in を使用し、Java Program を使用)、これ以上入力を行うことができないため、 hasNext() はファイルの最後で false を返します。

このトピックに関するドキュメント ( https://docs.oracle.com/javase/9​​/docs/api/java/util/Scanner.html#hasNext-- ) を実際に見つけることができません。したがって、誰かが適切で技術的な正しい答えを見つけたら、私はとてもうれしいです。

于 2013-06-01T15:00:01.790 に答える
1

確かではありませんが、以下は私自身の経験です:
Scanner オブジェクトにファイルが供給されると、ブロックされません!
「ファイルを与えられた」という用語は、スキャナーが次のように構築されていることを意味します。
Scanner scanner = new Scanner("myFile.txt");

ただし、スキャナーがオブジェクトのgetInputStream()メソッドを使用して構築されている場合、次のようになります。Socket

input = socket.getInputStream();
Scanner scanner = new Scanner(input);

スキャナがブロックされます!

于 2016-08-02T15:42:20.640 に答える
1

ユーザー入力を待っている間に他に何もすることがない場合は、次の入力が到着するまでその呼び出しでブロックされても問題ありません。

入力を待っている間に他のコードを実行したい場合は、新しいスレッドを生成し、hasNextそこから他のブロッキング スキャナー メソッドを呼び出します。

于 2013-06-01T13:23:56.907 に答える