我用java编写了一个服务器/客户端应用程序。现在我必须创建一个测试组件来与服务器交互。测试组件本身包含一个处理客户端实例的类(每个都有一个 ProcessBuilder)。
现在问题来了:为了解析服务器响应(找到响应的结尾),我关闭了转义序列中的特定行(例如 \t\b)。这按预期工作,但在向服务器发送特定命令之前,我必须清除 InputStream(丢弃流中的所有内容,如日志条目、状态消息等)。
//input=process.getInputStream();
//out = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
public String send(String command){
log.info("execute: " + command);
try{
//clear old output
int chars = input.available();
log.info("Skip " + chars + " characters from process output.");
input.skip(chars);
out.write(command + "\n");
out.flush();
}catch (IOException e){
log.error("could not write to process", e);
}
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
StringBuilder str = new StringBuilder();
String line;
try {
while( (line = reader.readLine()) != null ){
log.info("new line " + line);
if(line.contains("\t\b")){
//skip others
input.skip(input.available());
break;
}
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return str.toString();
}
但这不起作用。
示例输出
0 [main] INFO loadtesting.ClientHandler - ClientHandler started 1543748404 (localhost 9000 )
6 [main] INFO loadtesting.ClientHandler - execute: somecommand
6 [main] INFO loadtesting.ClientHandler - Skip 0 characters from process output.
112 [main] INFO loadtesting.ClientHandler - new line Connection successfully
113 [main] INFO loadtesting.ClientHandler - new line no entries available\t\b
“连接成功”应该被丢弃。
113 [main] INFO loadtesting.ClientHandler - execute: somecommand
113 [main] INFO loadtesting.ClientHandler - Skip 0 characters from process output.
114 [main] INFO loadtesting.ClientHandler - new line no entries available\t\b
114 [main] INFO Test - Test: close
114 [main] INFO loadtesting.ClientHandler - ClientHandler Closed 1543748404
114 [main] INFO loadtesting.ClientHandler - und ciao
更新 我发现了问题,但没有解决方案。这是因为 InputStream 的可用方法总是返回 0:
InputStream 类的可用方法总是返回 0。
现在我将搜索 IS 的一个子节点,它实现了 available()。