如何在 Java 中将实时数据从 ProcessBuilder 打印到控制台?

How to print the live data from ProcessBuilder to console in Java?

下面是我从控制台读取输出的代码。我需要实时读取 tracert 路径以进行控制台。

下面的代码仅在完成该过程后立即打印数据。

有人可以帮助我吗?

ProcessBuilder f = new ProcessBuilder("cmd.exe","tracert ip_address");
Process p = f.start();

BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader readers = new BufferedReader(new InputStreamReader(p.getErrorStream()));
String lines =null;
System.out.println();

while((lines = reader.readLine())!=null) {
    System.out.println("lines:"+lines);
}

String lines1 =null;
while((lines1 = readers.readLine())!=null) {
    System.out.println("error lines:"+lines1);
}

这里有一些应该有用的建议。

您不需要使用 CMD.EXE 来启动 TRACERT.EXE,因为如果它在路径上或完全限定它的路径,您可以直接 运行 它。如果您确实使用 CMD,则使用“/C”标志以确保它 运行 只是该命令。

String ip = "bbc.com";
String [] cmd = {"cmd.exe", "/c", "tracert "+ip};
System.out.println("Running:"+Arrays.toString(cmd));

在同一线程中使用 STDOUT 和 STDERR 如果写入大量数据会导致进程冻结。使用文件重定向,或重定向 ERR->OUT:

ProcessBuilder f = new ProcessBuilder(cmd);
f.redirectErrorStream(true);
Process p = f.start();

不要在输出循环上浪费时间,如果您想捕获它,请发送到 new ByteArrayOutputStream(),或者直接发送到 System.out:

try(var stdout = p.getInputStream()) {
   stdout.transferTo(System.out);
}

始终等待进程结束:

int rc = p.waitFor();

System.out.println("Exit:"+p.pid()+" RESULT:"+rc +' '+(rc == 0 ? "OK":"**** ERROR ****"));