2011-10-31 93 views
2

我在eclipse中使用Runtime.getRuntime()。exec來從當前程序運行另一個java程序。 我用下面的代碼。在eclipse中使用Runtime.getRuntime()。exec

InputStreamReader isr=new InputStreamReader(System.in); 
BufferedReader br=new BufferedReader(isr); 
System.out.println("Enter the class name"); 
String s=br.readLine();  
String str="XYZ"; 
String[] cmd = {"java","-cp", "C:/Users/..../workspace/Testing/bin",s,str};   
Process pro=Runtime.getRuntime().exec(cmd); 

我還將一個字符串「XYZ」傳遞給該程序。該程序只接受的字符串和顯示

你的字符串是XYZ

但是,通過使用線

字符串[] CMD = { 「java的」, 「 - CP」, 「C:/ Users /..../ workspace/Testing/bin」,s,str};

我能夠運行該程序,但它不接受任何參數。它既不顯示輸出也不顯示任何錯誤。

我哪裏錯了?

審議該方案被稱爲是

import java.io.*; 
public class Test 
{ 
public static void main(String[] args) throws IOException 
{ 
    InputStreamReader isr=new InputStreamReader(System.in); 
    BufferedReader br=new BufferedReader(isr); 
    System.out.println("Enter any string"); 
    String s=br.readLine(); 
    System.out.println("Your string is "+s);  
} 
} 

這個程序應該接受字符串XYZ,並打印你的字符串是XYZ

+0

爲了記錄在案,如果你手工執行Eclipse外的exe進程是否能夠正常工作? – Grambot

+0

@TheCapn:執行正在和沒有日食,但我不能通過任何參數在兩種方式 – Anil

+0

我懷疑這個問題是你正在調用的程序。你有源代碼嗎?還是更多的黑盒操作? – Grambot

回答

0

您正在執行javac,語言編譯器。我相信你想用你的main方法在類文件上調用java運行庫。將javac替換爲java,並指定您的主類。

+0

哦對不起。那是那邊的java。不是javac。 – Anil

3

您需要使用getInputStream()getErrorStream()Process讀取輸出(和錯誤)流。如果您想等待流程完成,您需要一個單獨的線程。

String[] cmd = {"java", "-cp", "C:/Users/..../workspace/Testing/bin", s, str}; 
Process p = new ProcessBuilder(cmd).redirectErrorStream(true).start(); 
final InputStream pOut = p.getInputStream(); 
Thread outputDrainer = new Thread() 
{ 
    public void run() 
    { 
     try 
     { 
      int c; 
      do 
      { 
       c = pOut.read(); 
       if (c >= 0) 
        System.out.print((char)c); 
      } 
      while (c >= 0); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
}; 
outputDrainer.start(); 

p.waitFor(); 

如果您使用的是Java 7,並希望這一過程的所有輸出重定向到控制檯,代碼是相當簡單:

String[] cmd = {"java", "-cp", "C:/Users/..../workspace/Testing/bin", s, str}; 
Process p = new ProcessBuilder(cmd).redirectError(Redirect.INHERIT) 
            .redirectOutput(Redirect.INHERIT) 
            .start(); 
p.waitFor(); 

redirectError()redirectOutput()方法與Redirect.INHERIT原因輸出只是被髮送到父Java進程。

+0

即使你的代碼不工作。我在我的問題(要調用的程序)中粘貼了一個非常簡單的代碼,它應該接受字符串「XYZ」,並在我們的程序 – Anil

+0

中顯示輸出'「您的字符串是XYZ」'java 6版本不起作用對我來說也是。 – alexsb

0

您正在傳遞您的數據作爲參數,但從System.in讀取它。如果你從參數中讀取數據,它將起作用。 所以做@ PRunge說來捕獲子進程打印和使用這個作爲你的測試,一切都會工作得很好。

import java.io.*; 
public class Test 
{ 
    public static void main(String[] args) throws IOException 
    { 
     if(args.length==0) 
      System.out.println("No String received"); 
     else 
      System.out.println("Your string is " + args[0]);  
    } 
} 

確保您同時檢查InputStreamErrorStream

不過,若你想通過System.in來傳遞數據,那麼你必須改變你的調用代碼:

InputStreamReader isr=new InputStreamReader(System.in); 
BufferedReader br=new BufferedReader(isr); 
System.out.println("Enter the class name"); 
String s=br.readLine();  
String str="XYZ"; 
String[] cmd = {"java","-cp", "C:/Users/..../workspace/Testing/bin",s};   
Process pro=Runtime.getRuntime().exec(cmd); 
PrintWriter output= new PrintWriter(pro.getOutputStream()); 
output.println(str); 
相關問題