2016-10-05 121 views
0

processbuilder不允許重定向輸入流/輸出流。我如何在java中創建管道進程? 我試圖使用這個命令,但它不起作用。編輯:仍然這是行不通的。如何使用processbuilder在窗口中運行管道進程

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

我把所有的標記,包括'「<」'和'「|」'入'ArrayList中',使用與的ProcessBuilder創建我處理。 –

+1

換句話說,你的exec當前擁有兩個字符串,相反它應該由9個不同的標記組成。 –

+0

仍然無法正常工作。 ArrayList cmd = new ArrayList <>(); \t \t String s =「/ R」; \t cmd.add(「cmd」); \t cmd.add(「sort」); \t cmd.add(「<」); \t cmd.add(「randomwords.txt」); \t cmd.add(「|」); \t cmd.add(「sort」); \t cmd.add(「/ R」); \t cmd.add(「>」); \t cmd.add(「reversesortes.txt」); \t ProcessBuilder builder = new ProcessBuilder(cmd); \t \t builder.redirectError(new File(「error.txt」)); \t \t Process process = builder.start(); \t \t System.out.println(「im here」); \t \t int i = process.waitFor(); \t \t \t \t System.out.println(「i」+ i); – Datta

回答

0

由於shell的名稱是cmd,我假定您的操作系統是Windows。 cmd.exe要求/c引入作爲參數傳遞的命令。在交互式外殼中,該命令:

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> 

只打開一個新的交互式外殼上它的標準輸入等待命令而

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