我从apache的telnet客户端获取输入流。每次我向telnet客户端发送一个命令,它会将终端输出写回InputStream,但是这个流在telnet会话之前一直保持打开状态。
现在我想要一种方法来读取此流上的数据直到结束。问题已结束无法确定,因为流始终打开。我找到的一种解决方法是读取数据直到遇到特定字符(其中在大多数情况下都是提示)。但是提示会根据命令不断变化,我无法知道命令执行后会发生什么。
在SO上有一个类似的问题,它解释得更好,但没有答案:
请帮忙......
答案 0 :(得分:0)
你需要产生一个单独的线程来阅读。你不能只是在一个线程上以“乒乓”方式进入,正是因为你面临的原因。
顺便说一下:你现在联系的问题已经得到了答案。它建议不要将CPU驱动到100%负载,这是非常好的建议:)
然而read
方法会阻塞,所以你只需将它放入一个线程循环中,并在收到某些内容时回调。结束循环并在IOException或“-1”上终止线程,并幸福地生活在everafter:)
答案 1 :(得分:-1)
最后我确实使用了超时。基本上,我这样做了,如果1秒后字符不可用则放弃。而不是inputStream.read()我使用了这个:
private char readChar(final InputStream in){
ExecutorService executor = Executors.newFixedThreadPool(1);
//set the executor thread working
Callable<Integer> task = new Callable<Integer>() {
public Integer call() {
try {
return in.read();
} catch (Exception e) {
//do nothing
}
return null;
}
};
Future<Integer> future = executor.submit(task);
Integer result =null;
try {
result= future.get(1, TimeUnit.SECONDS); //timeout of 1 sec
} catch (TimeoutException ex) {
//do nothing
} catch (InterruptedException e) {
// handle the interrupts
} catch (ExecutionException e) {
// handle other exceptions
} finally {
future.cancel(false);
executor.shutdownNow();
}
if(result==null)
return (char) -1;
return (char) result.intValue();
}