我有以下代码:
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()
在每次运行循环时都等待用户输入?
在方法exec()
中,您正在调用正在阻塞的_inputStream.read()
。但这并不意味着在这个阶段执行超出exec()!这不像是一个C#协同程序。
因此,实际上_inputStream.read()
是针对_InputStream中其他地方分配的InputStream的任何实例调用的,它会在您有机会调用ui.setInputStream( new ByteArrayInputStream( .....
之前打印四行输出
因此,你在同一个InputStream中读取了4次,然后在读取后重置它。因此,你有相同的4行输出。
Err,每次调用setInputStream()后调用exec()?
这不可能是您的真实代码。
此外,重置方法会将流重置回上次设置标记的位置或开始位置,但不会取出其中的数据。