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

Err,每次调用 setInputStream() 后调用 exec()?

这不可能是您的真实代码。

于 2013-02-06T22:49:07.833 回答
0

exec()您正在调用的方法中_inputStream.read(),它是阻塞的。但这并不意味着在这个阶段执行超出了 exec() !这不像 C# 协程。

所以实际上_inputStream.read()是针对在 _inputStream 其他地方分配的任何 InputStream 实例调用的,它会在您有机会调用之前打印四行输出ui.setInputStream( new ByteArrayInputStream( .....

因此,您在同一个 InputStream 中阅读了 4 次,并在阅读后将其重置。因此,您有相同的 4 行输出。

于 2013-02-06T22:49:14.863 回答
0

此外,reset-method 会将流重置回设置最后一个标记的位置或开始位置,但不会取出那里的数据。

于 2013-02-06T23:01:50.453 回答