简体   繁体   English

如何使用ProcessBuilder在Windows中运行管道进程

[英]How to use processbuilder to run piped processes in windows

processbuilder does not allow redirecting inputstream/output streams. processbuilder不允许重定向输入流/输出流。 How can I create piped processes in java? 如何在Java中创建管道进程? I tried to use this command but it doesn't work. 我尝试使用此命令,但是它不起作用。

process = Runtime.getRuntime().exec("cmd","sort < randomwords.txt | sort /R >reversesortes.txt");

EDIT: Still this is not working. 编辑:仍然这是行不通的。

ArrayList<String> cmd = new ArrayList<>(); 
String s = "/R"; 
cmd.add("cmd"); 
cmd.add("sort"); 
cmd.add("<"); 
cmd.add("randomwords.txt"); 
cmd.add("|"); 
cmd.add("sort"); 
cmd.add("/R"); 
cmd.add( ">"); 
cmd.add("reversesortes.txt"); 
ProcessBuilder builder = new ProcessBuilder(cmd); 
builder.redirectError(new File("error.txt")); 
Process process = builder.start(); 
System.out.println("im here" ); 
int i = process.waitFor(); 
System.out.println("i"+ i );

As the name of the shell is cmd , I assume that your OS is Windows. 由于外壳程序的名称是cmd ,因此我假设您的操作系统是Windows。 cmd.exe requires a /c to introduce a command passed as parameter. cmd.exe需要/c来引入作为参数传递的命令。 In an interactive shell, this command: 在交互式外壳中,此命令:

C:\Users\sj>cmd echo foo
Microsoft Windows [version 6.0.6002]
Copyright (c) 2006 Microsoft Corporation. Tous droits réservés.

C:\Users\sj>

only opens a new interactive shell waiting for commands on its standard input whereas 仅打开一个新的交互式外壳,以等待其标准输入上的命令,而

C:\Users\sj>cmd /c echo foo
foo

C:\Users\sj>

correctly executes the command passed as parameter. 正确执行作为参数传递的命令。

So you should write: 所以你应该写:

ArrayList<String> cmd = new ArrayList<>(); 
cmd.add("cmd"); 
cmd.add("/C"); 
cmd.add("sort < randomwords.txt | sort /R >reversesortes.txt"); 
ProcessBuilder builder = new ProcessBuilder(cmd); 
builder.redirectError(new File("error.txt")); 
Process process = builder.start(); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM