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

时间:2016-10-05 01:16:30

标签: java pipe

processbuilder不允许重定向输入流/输出流。如何在java中创建管道进程? 我尝试使用此命令,但它无法正常工作。

process = Runtime.getRuntime().exec("cmd","sort < randomwords.txt | sort /R >reversesortes.txt");
编辑:仍然没有用。

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 );

1 个答案:

答案 0 :(得分:1)

由于shell的名称是cmd,我假设您的操作系统是Windows。 cmd.exe需要/c来引入作为参数传递的命令。在交互式shell中,此命令:

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>

只打开一个新的交互式shell,等待其标准输入上的命令,而

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

C:\Users\sj>

正确执行作为参数传递的命令。

所以你应该写:

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();