当 运行 在 Ubuntu 上使用 ProcessBuilder 命令时,永远等待输出
Waiting output for forever when running commands with ProcessBuilder on Ubuntu
我正在尝试获取 Ubuntu 和 ProcessBuilder.I 上的命令的执行结果 已尝试通过以下技术获取输出结果。但是没有显示结果,程序等待无输出。
正在执行命令:
String[] args = new String[]{"/bin/bash", "-c", "pandoc -f html - t asciidoc input.html"};
Process process = new ProcessBuilder(args).start();
获取输出技巧1:
InputStream inputStream = process.getInputStream();
StringWriter stringWriter = new StringWriter();
IOUtils.copy(inputStream, stringWriter, "UTF-8");
// Waiting
String asciidocoutput = writer.toString();
获取输出技巧2:
BufferedReader reader= new BufferedReader(new InputStreamReader(process.getInputStream()));
StringBuilder builder = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
// Waiting
builder.append(line);
builder.append(System.getProperty("line.separator"));
}
String result = builder.toString();
ProcessBuilder
的构造函数接受一个命令,每个后续字符串都被视为第一个字符串的参数,被识别为主要命令。
尝试将 /bin/bash
替换为 pandoc
,看看是否可行。
在我这边,我可以在没有 ProcessBuilder 帮助的情况下 运行 任意命令,而是使用 Runtime.getRuntime().exec(...)
,如下所示:
public static void main(String[] args) throws Exception {
Process proc = Runtime.getRuntime().exec("cmd /c ipconfig");
BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = null;
while((line = reader.readLine()) != null){
System.out.println(line);
}
}
获得预期输出:
Configurazione IP di Windows
Scheda Ethernet Ethernet:
Suffisso DNS specifico per connessione:
Indirizzo IPv6 locale rispetto al collegamento . : fe80::fcba:735a:5941:5cdc%11
Indirizzo IPv4. . . . . . . . . . . . : 192.168.0.116
Subnet mask . . . . . . . . . . . . . : 255.255.255.0
Gateway predefinito . . . . . . . . . : 192.168.0.1
Process finished with exit code 0
如果您确实需要使用 ProcessBuilder
,可以通过这样定义 Process
来实现相同的行为:
Process proc = new ProcessBuilder("ipconfig").start();
只需调用你想要的命令运行。
我正在尝试获取 Ubuntu 和 ProcessBuilder.I 上的命令的执行结果 已尝试通过以下技术获取输出结果。但是没有显示结果,程序等待无输出。
正在执行命令:
String[] args = new String[]{"/bin/bash", "-c", "pandoc -f html - t asciidoc input.html"};
Process process = new ProcessBuilder(args).start();
获取输出技巧1:
InputStream inputStream = process.getInputStream();
StringWriter stringWriter = new StringWriter();
IOUtils.copy(inputStream, stringWriter, "UTF-8");
// Waiting
String asciidocoutput = writer.toString();
获取输出技巧2:
BufferedReader reader= new BufferedReader(new InputStreamReader(process.getInputStream()));
StringBuilder builder = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
// Waiting
builder.append(line);
builder.append(System.getProperty("line.separator"));
}
String result = builder.toString();
ProcessBuilder
的构造函数接受一个命令,每个后续字符串都被视为第一个字符串的参数,被识别为主要命令。
尝试将 /bin/bash
替换为 pandoc
,看看是否可行。
在我这边,我可以在没有 ProcessBuilder 帮助的情况下 运行 任意命令,而是使用 Runtime.getRuntime().exec(...)
,如下所示:
public static void main(String[] args) throws Exception {
Process proc = Runtime.getRuntime().exec("cmd /c ipconfig");
BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = null;
while((line = reader.readLine()) != null){
System.out.println(line);
}
}
获得预期输出:
Configurazione IP di Windows
Scheda Ethernet Ethernet:
Suffisso DNS specifico per connessione:
Indirizzo IPv6 locale rispetto al collegamento . : fe80::fcba:735a:5941:5cdc%11
Indirizzo IPv4. . . . . . . . . . . . : 192.168.0.116
Subnet mask . . . . . . . . . . . . . : 255.255.255.0
Gateway predefinito . . . . . . . . . : 192.168.0.1
Process finished with exit code 0
如果您确实需要使用 ProcessBuilder
,可以通过这样定义 Process
来实现相同的行为:
Process proc = new ProcessBuilder("ipconfig").start();
只需调用你想要的命令运行。