public static void executeCommand(String cmd) {
try {
Process process = Runtime.getRuntime().exec(cmd, null,
new File("/usr/hadoop-0.20.2/"));
InputStream stdin = process.getInputStream();
InputStreamReader isr = new InputStreamReader(stdin);
BufferedReader br = new BufferedReader(isr);
String line;
System.out.println("<output></output>");
while ((line = br.readLine()) != null)
System.out.println(line);
InputStreamReader esr = new InputStreamReader(
process.getErrorStream());
BufferedReader errorReader = new BufferedReader(esr);
String lineError;
while ((lineError = errorReader.readLine()) != null)
System.out.println(lineError);
process.waitFor();
System.out.println("");
} catch (Exception e) {
e.printStackTrace();
}
}
这是我执行名为'cmd'的命令的代码。但我无法通过此代码获得实时输出。命令完成后输出结果。我想要实时输出。有没有办法做到这一点?
答案 0 :(得分:3)
您描述的问题很可能是由您调用的应用程序引起的:许多应用程序在连接到终端时使用无缓冲的I / O,但在连接到管道时会使用I / O.所以你的cmd
可能只是决定不以小比特写出它的输出,而是以巨大的块为单位。正确的解决方法是调整命令,在适当的时间刷新其输出。在Java方面你几乎无能为力。另请参阅this answer。
答案 1 :(得分:0)
我认为你需要一个线程来处理输出。
您应首先尝试运行一段时间的cmd
上次,当我尝试使用wvdial命令时(这个wvdial在我们停止之前不会完成),我需要一个线程来读取wvdial的输出
答案 2 :(得分:0)
实际上,问题在于Process.getInputStream()
返回BufferedReader
。
因此,即使被调用的子进程刷新了其所有输出,也只有在缓冲区已满的情况下,调用Java程序中的读取操作才能获取该结果。