2014-02-06 9 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-файл (str.java) из другого Java-класса (ExecuteShellComand.java). То, что я пытаюсь сделать, - это если «str.java» успешно компилируется, тогда я хочу выполнить команду «java str», но если компиляция завершилась неудачей, следует напечатать правильную стеклу или ошибки. Я сохраняю stacktrace или ошибки в переменной 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

Затем вы можете захватывать оба потока входов и ошибок как разные буферизаторы и получать данные из них. – Sanjeev

1

Класс Process пытается мимизировать процесс ОС. Это означает, что процесс поддерживает разные выходные потоки для сообщений об ошибках и нормальных сообщениях и один поток для ввода. В 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

Смежные вопросы