提问人:chris01 提问时间:9/7/2023 更新时间:9/7/2023 访问量:44
如何使用Javas ProcessBuilder进行输入重定向?
How to have input-redirection with Javas ProcessBuilder?
问:
如何将输入重定向应用于 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 表示成功)返回或没有完成。
答:
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 ();
评论
<< END
是 shell 语法。该行后面是一些文本,后跟 shell 脚本中的一行,或作为 shell 的输入 ()。从 Java 程序运行进程时,您希望输入来自哪里?cat << END > output
END
stdin