0

私は次のコードを持っています:

public class Interface {    
    public void exec(){            
        Scanner scanner = null;
        Integer count = 0;

        while( count < 4 ){               
            _inputStream.read();
            scanner = new Scanner( _inputStream );
            String inputLine = scanner.nextLine();
            _inputStream.reset();
            System.out.println( inputLine );
        }
        scanner.close();
    }

    public void setInputStream( InputStream inputStream ){
        _inputStream = inputStream;
    }
}

次のコードでテストしようとしています。

public void testInterface() {
    Interface ui = new Interface();
    ui.exec();

    ui.setInputStream( new ByteArrayInputStream( "This is the first prompt".getBytes( Charset.defaultCharset() ) ) );   
    ui.setInputStream( new ByteArrayInputStream( "This is the second prompt".getBytes( Charset.defaultCharset() ) ) );  
    ui.setInputStream( new ByteArrayInputStream( "This is the third prompt".getBytes( Charset.defaultCharset() ) ) );           
    ui.setInputStream( new ByteArrayInputStream( "This is the fourth prompt".getBytes( Charset.defaultCharset() ) ) );
}

私が取得したい出力は

This is the first input
This is the second input
This is the third input
This is the fourth input

しかし、私が実際に得ているのは

his is the first input
his is the first input
his is the first input
his is the first input

問題は、少なくとも私が知る限り_inputStream、ループの各反復でがクリアされていないことです。つまり、read()関数は新しいデータストリームを待つのではなく、すぐに戻ってきます。ただし、読み取るたびにストリームをリセットしているので、なぜそうなるのかわかりません。

_inputStream.read()ループが実行されるたびにユーザー入力を待機するようにコードを修正するにはどうすればよいですか?

4

3 に答える 3

0

エラー、毎回setInputStream()を呼び出した後、exec()を呼び出しますか?

これはおそらくあなたの本当のコードではありえません。

于 2013-02-06T22:49:07.833 に答える
0

exec()呼び出しているメソッドで、_inputStream.read()ブロックしています。ただし、この段階でexec()が実行されなくなるわけではありません。これはC#コルーチンのようなものではありません。

したがって、実際に_inputStream.read()は、他の場所で_inputStreamに割り当てられているInputStreamのインスタンスに対して呼び出され、呼び出す前に4行の出力が出力されます。ui.setInputStream( new ByteArrayInputStream( .....

したがって、同じInputStreamを4回読み取り、読み取った後にリセットします。したがって、同じ4行の出力があります。

于 2013-02-06T22:49:14.863 に答える
0

また、reset-methodは、ストリームを最後のマークが設定された場所または最初にリセットしますが、そこにあるデータは取り出しません。

于 2013-02-06T23:01:50.453 に答える