Ank*_*and 56 java stream processbuilder
我正在使用以下代码来启动进程构建器.我想知道如何将其输出重定向到String.
ProcessBuilder pb = new ProcessBuilder(System.getProperty("user.dir")+"/src/generate_list.sh", filename);
Process p = pb.start();
Run Code Online (Sandbox Code Playgroud)
我试过使用,ByteArrayOutputStream但它似乎没有用.
Rei*_*eus 69
从中读取InputStream.您可以将输出附加到StringBuilder:
BufferedReader reader =
new BufferedReader(new InputStreamReader(process.getInputStream()));
StringBuilder builder = new StringBuilder();
String line = null;
while ( (line = reader.readLine()) != null) {
builder.append(line);
builder.append(System.getProperty("line.separator"));
}
String result = builder.toString();
Run Code Online (Sandbox Code Playgroud)
Dan*_*iel 21
使用Apache Commons IOUtils,您可以在一行中完成:
ProcessBuilder pb = new ProcessBuilder("pwd");
String output = IOUtils.toString(pb.start().getInputStream(), StandardCharsets.UTF_8);
Run Code Online (Sandbox Code Playgroud)
Gre*_*g T 10
Java 8示例:
public static String runCommandForOutput(List<String> params) {
ProcessBuilder pb = new ProcessBuilder(params);
Process p;
String result = "";
try {
p = pb.start();
final BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
StringJoiner sj = new StringJoiner(System.getProperty("line.separator"));
reader.lines().iterator().forEachRemaining(sj::add);
result = sj.toString();
p.waitFor();
p.destroy();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
用法:
List<String> params = Arrays.asList("/bin/sh", "-c", "cat /proc/cpuinfo");
String result = runCommandForOutput(params);
Run Code Online (Sandbox Code Playgroud)
我使用这个确切的代码,它适用于单行或多行结果.您也可以添加错误流处理程序.
你可能会这样做:
private static BufferedReader getOutput(Process p) {
return new BufferedReader(new InputStreamReader(p.getInputStream()));
}
private static BufferedReader getError(Process p) {
return new BufferedReader(new InputStreamReader(p.getErrorStream()));
}
...
Process p = Runtime.getRuntime().exec(commande);
BufferedReader output = getOutput(p);
BufferedReader error = getError(p);
String ligne = "";
while ((ligne = output.readLine()) != null) {
System.out.println(ligne);
}
while ((ligne = error.readLine()) != null) {
System.out.println(ligne);
}
Run Code Online (Sandbox Code Playgroud)
从Java 9 开始,我们终于有了一个单行代码:
ProcessBuilder pb = new ProcessBuilder("pwd");
Process process = pb.start();
String result = new String(process.getInputStream().readAllBytes());
Run Code Online (Sandbox Code Playgroud)
只需添加.inheritIO();到流程构建器行。
IE:
ProcessBuilder pb = new ProcessBuilder(script.sh).inheritIO();
For Java 7 and 8 this should work:
private String getInputAsString(InputStream is)
{
try(java.util.Scanner s = new java.util.Scanner(is))
{
return s.useDelimiter("\\A").hasNext() ? s.next() : "";
}
}
Run Code Online (Sandbox Code Playgroud)
Then in your code, do this:
String stdOut = getInputAsString(p.getInputStream());
String stdErr = getInputAsString(p.getErrorStream());
Run Code Online (Sandbox Code Playgroud)
I shamelessly stole that from: How to redirect Process Builder's output to a string?
| 归档时间: |
|
| 查看次数: |
75275 次 |
| 最近记录: |