2014-01-30 80 views
-2

好吧,我們來看看吧: 當我通過static main傳遞參數時,我的程序工作正常。但是當我通過在main中聲明的相同「參數」時,不起作用。如果聽起來很混亂,這裏是代碼。我所要做的就是做這些東西,沒有參數。 這裏的DEBUG:http://i.stack.imgur.com/sbGyo.pngmain(String [] args)不同的String [] args = {.....}?

import java.io.*; 
import java.util.*; 

public class DoProcessBuilder extends Thread { 
    public static void main (String[] args) throws IOException, InterruptedException { 
    DoProcessBuilder teste = new DoProcessBuilder(); 

    String[] uia = {"ls","-al","|","grep","bash"}; 
    teste.ExecCommand(uia); // here this not works, WHY? if I execute the "java DoProcessBuilder ls -al | grep bash" works fine? 

    teste.ExecCommand(args); // works fine! 

    } 

    public String ExecCommand(String args[]) throws IOException, InterruptedException { 
    StringBuffer x = new StringBuffer(); 
    if (args.length <= 0) { 
     System.err.println("Need command to run"); 
    } 

    Process process = new ProcessBuilder(args).start(); 
    process.waitFor(); 
    InputStream is = process.getInputStream(); 
    InputStreamReader isr = new InputStreamReader(is); 
    BufferedReader br = new BufferedReader(isr); 
    String line = ""; 

    while((line = br.readLine()) != null){ 
     x.append(line+"\n"); 
    } 
    System.out.println("\nCOMMAND OUT \n"+x.toString()); 

    return x.toString(); 

    } 
} 
+5

請給我們看看你的堆棧跟蹤「不工作」沒有幫助我們 –

+2

它應該工作。像Philipp說的那樣,請張貼堆棧跟蹤。 – Someone

+1

同時打印數組並檢查它們是否相等 –

回答

0

沒有問題,你提到的地方。但隨着teste.ExecCommand(args);你會得到ArrayIndexOutOfBoundsException

StringBuffer x = new StringBuffer(); 
    if (args.length <= 0) { 
     System.err.println("Need command to run"); 
    } 

    Process process = new ProcessBuilder(args).start(); // ArrayIndexOutOfBoundsException 
    process.waitFor(); 
    InputStream is = process.getInputStream(); 
    InputStreamReader isr = new InputStreamReader(is); 
    BufferedReader br = new BufferedReader(isr); 
    String line = ""; 

    while((line = br.readLine()) != null){ 
     x.append(line+"\n"); 
    } 
    System.out.println("\nCOMMAND OUT \n"+x.toString()); 

    return x.toString(); 
+0

我知道,如果你執行沒有參數,它會這樣做。像我提到的那樣用args來執行此操作。 – Sycon

2

你試圖用的ProcessBuilder執行殼管。這是行不通的。管道|對於ls命令無效。您必須啓動一個shell new ProcessBUilder("sh")

它和args一起工作正常,因爲你的程序沒有從調用shell獲得管道和其餘部分。你的程序只獲得ls -al

+0

用args ls -al |執行這個程序...它的工作原理 – Sycon

+1

如果你執行'java doProcessBuilder ls -al | grep bash',你永遠不會把''''grep'' bash'放到你的程序中。 – PeterMmm

+0

彼得,你試過執行這個程序嗎?按原樣編譯這些程序。去你的命令/ shell並執行java DoProcessBuilder ls -al | grep的東西。有用! – Sycon

相關問題