我正在编写一个程序,它基本上通过java发送linux命令,然后打印输出。如果输出只有一行但是多行输出我无法弄清楚我做错了什么,它工作正常。例如,要检查内存使用情况,我使用“free”命令但它只返回第1行和第3行。这是我的代码:
if (clinetChoice.equals("3"))
{
String command = "free";
Process process = Runtime.getRuntime().exec(command);
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
System.out.println("You Chose Option Three");
String line;
while ((line = reader.readLine()) != null)
{
output += line;
System.out.println(line);
line = reader.readLine();
}
}
当我运行它时它只返回:
total used free share buffers cached
-/+ buffers/cache: 6546546 65464645
客户代码:
while ((fromServer = input.readLine()) != null)
{
System.out.println("Server: " + fromServer);
if (fromServer.equals("Bye"))
break;
System.out.print("Enter your choice: ");
fromClient = stdIn.readLine().trim();
if(fromClient.equals("1"))
{
System.out.println("Client: " + fromClient);
output.println(fromClient);
}
if(fromClient.equals("2"))
{
System.out.println("Client: " + fromClient);
output.println(fromClient);
}
if(fromClient.equals("3"))
{
System.out.println("Client: " + fromClient);
output.println(fromClient);
}
if(fromClient.equals("4"))
{
System.out.println("Client: " + fromClient);
output.println(fromClient);
break;
}
}
答案 0 :(得分:6)
您在循环测试和循环体中调用readLine
。因此,对于循环的每次迭代,readLine
被调用两次,其中一个结果被丢弃:它不会打印或添加到output
。这与您描述的结果相符。
这个循环应该足够了:
while ((line = reader.readLine()) != null)
{
output += line + System.getProperty("line.separator");
System.out.println(line);
}
如果您只是尝试打印整个输出一次,并且由于您在output
变量中收集输出,则可以将println
移出循环:
while ((line = reader.readLine()) != null)
{
output += line + System.getProperty("line.separator");
}
System.out.println(output);
答案 1 :(得分:1)
只需使用此...您正在呼叫readLine()
两次....
while ((line = reader.readLine()) != null)
{
System.out.println(line);
}
如果要将数据分配给输出varible ..然后在while循环中执行此操作..
output = output + line;
答案 2 :(得分:1)
我应该在评论中指出另外。使用readline()
两次,你应该严格同时使用stdout / stderr。否则,您将面临阻止进程输出的风险,因为您没有使用它。有关详细信息,请参阅this SO answer。