2014-02-06 30 views
0
import java.io.BufferedReader; 
import java.io.InputStreamReader; 

public class ExecuteShellComand { 

    public static void main(String[] args) { 

     ExecuteShellComand obj = new ExecuteShellComand(); 
     String className = "str.java"; 
     String command = "javac " + className; 
     String output = obj.executeCommand(command); 
     System.out.println(output);// prints the output of the executed command 
    } 

    private String executeCommand(String command) { 
     StringBuffer output = new StringBuffer(); 
     Process p; 
     try { 
      p = Runtime.getRuntime().exec(command); 
      p.waitFor(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); 
      String line = ""; 
      while ((line = reader.readLine()) != null) { 
       output.append(line + "\n"); 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return output.toString(); 

    } 

} 

我想從另一個Java類(ExecuteShellComand.java)編譯Java文件(str.java)。我想要做的是如果「str.java」編譯成功,那麼我想執行「java str」命令,但是如果編譯失敗,那麼應該打印適當的堆棧跟蹤或錯誤。我正在存儲棧跟蹤或output變量中的錯誤。從另一個java類編譯java文件

但是,當我執行此代碼雖然「str.java」中有一些錯誤System.out.println(output)不打印錯誤。

+0

順便說一句,因爲Java 6中,JAVA提供了標準化的方式在運行時編譯的類。在這裏查看這篇文章:http://java-bytes.blogspot.de/2012/03/compile-java-files-at-runtime.html – rdllopes

回答

1

如果你想捕捉從錯誤中一個命令然後你將捕獲錯誤流而不是輸入流

因此,替換

BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); 

BufferedReader reader = new BufferedReader(new InputStreamReader(p.getErrorStream())); 
+0

如果我必須捕獲兩個流......然後呢? – rick

+0

然後,您可以捕獲inputream和errorstream作爲不同的緩衝讀取器,並從中獲取數據。 – Sanjeev

1

Process類嘗試模擬OS進程。這意味着,爲錯誤和正常消息保留不同的輸出流,併爲輸入保留一個流。在UNIX中,應該是:

wc <file> wc.count 2> wc.error 

在Java ...

  • 抽象的InputStream getErrorStream() 獲得子進程的錯誤流。
  • abstract InputStream getInputStream() 獲取子流程的輸入流。
  • 抽象的OutputStream的getOutputStream()

所以,你應該用getErrorStream()得到的錯誤..

重構代碼:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 

public class ExecuteShellComand { 

    public static void main(String[] args) { 
     ExecuteShellComand obj = new ExecuteShellComand(); 
     String className = "str.java"; 
     String command = "javac " + className; 
     obj.executeCommand(command); 
     System.out.println(obj.output); 
     System.out.println(obj.errors); 
    } 

    private String errors; 
    private String output; 

    private void executeCommand(String command) { 
     Process p; 
     try { 
      p = Runtime.getRuntime().exec(command); 
      p.waitFor(); 
      errors = readStream(p.getErrorStream()); 
      output = readStream(p.getInputStream()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    private String readStream(InputStream inputStream) throws IOException { 
     StringBuffer output = new StringBuffer(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 
     String line = ""; 
     while ((line = reader.readLine()) != null) { 
      output.append(line + "\n"); 
     } 
     return output.toString(); 
    } 

} 
+0

好的。但我要在哪裏使用getErrorStream()? – rick

+0

我編輯使用您的代碼來顯示哪裏... – rdllopes