如何使用Javas ProcessBuilder进行输入重定向?

How to have input-redirection with Javas ProcessBuilder?

提问人:chris01 提问时间:9/7/2023 更新时间:9/7/2023 访问量:44

问:

如何将输入重定向应用于 Javas ProcessBuilder?

例如,使用 Linux 的 cat

cat x.txt > output.txt

我的代码

// read x.txt with cat and redirect the output to output.txt
public static void main (String args []) throws Exception
{
    List <String> params = new ArrayList <String> ();
    params.add ("cat");
    params.add ("x.txt");       
    ProcessBuilder pb = new ProcessBuilder (params);
    pb.redirectOutput (new File ("output.txt"));
    Process p = pb.start ();
    p.waitFor (3, TimeUnit.SECONDS);
    System.out.println ("exit="+p.exitValue());
}

这很好用! 但是如何从文件更改为输入重定向呢?

cat << END > output

我试过这个 - 但没有用。

public static void main (String args []) throws Exception
{
    List <String> params = new ArrayList <String> ();
    params.add ("cat");
    params.add ("/dev/stdin");
    params.add ("<<";
    params.add ("END");
    
    ProcessBuilder pb = new ProcessBuilder (params);
    pb.redirectOutput (new File ("output.txt"));
    Process p = pb.start ();
    OutputStream os = p.getOutputStream ();
    os.write ("\nblabla\nEND\n".getBytes ());
    p.waitFor (3, TimeUnit.SECONDS);
    System.out.println ("exit="+p.exitValue());
}

无论我尝试什么,它都以 1(而不是 0 表示成功)返回或没有完成。

Java Linux ProcessBuilder IO 重定向

评论

3赞 Bodo 9/7/2023
<< END是 shell 语法。该行后面是一些文本,后跟 shell 脚本中的一行,或作为 shell 的输入 ()。从 Java 程序运行进程时,您希望输入来自哪里?cat << END > outputENDstdin
0赞 DuncG 9/7/2023
这回答了你的问题吗?在 java 上运行 exec 时退出(1)

答:

1赞 DuncG 9/7/2023 #1

该命令是一个 shell 命令,因此您需要通过 shell 运行它,因为cat << END > output

 List <String> params = List.of("/bin/sh", "-c", "cat << END > output")
1赞 jurez 9/7/2023 #2

您需要致电以告知流程没有更多数据传入。os.close()

0赞 chris01 9/7/2023 #3

我通过跳过

<<END

但在启动进程后打开了 OutputStream。 在此基础上,我将文件内容放入流程中。 冲洗和关闭流很重要。

ProcessBuilder pb = new ProcessBuilder (params);
Process p = pb.start ();
                
OutputStream os = p.getOutputStream ();
os.write (content_string);  
os.flush ();
os.close ();