sudo
直接调用ProcessBuilder
而不是外部脚本时,您可能会更容易。这只是手头任务的冗余复杂性。
您可以ProcessBuilder
使用整个命令行进行输入,例如,如下所示:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class q39836547 {
private static String[] cmdl = { "/usr/bin/sudo",
"ntpdate",
"-u",
"some.ntp.server" };
public static void main(String[] as) throws IOException {
ProcessBuilder pb = new ProcessBuilder(cmdl);
Process p = pb.start();
BufferedReader stdin = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader stderr = new BufferedReader(new InputStreamReader(p.getErrorStream()));
try { p.waitFor(); }
catch(InterruptedException e) { }
if(p.exitValue() != 0)
System.err.println("The process was not executed successfully.");
else
System.err.println("The process ran and exited cleanly.");
stdin.lines().forEach(s -> System.out.println("STDOUT: " + s));
stderr.lines().forEach(s -> System.out.println("STDERR: " + s));
}
}
您还必须waitFor()
(正如您所做的那样) ntpdate 才能完成。否则,您最终可能会在任何一个流产生任何输出时getInputStream()
或之前读取其标准输入或标准错误。getErrorStream()
如果您注释掉 try-catch-block,您偶尔会在尝试读取其输入时看到该进程如何仍在运行。实际上,这几乎每次都会发生。