Компиляция и запуск Java-программы из другой Java-программы
Используя класс CompileAndRun, теперь я могу скомпилировать и запустить мой класс HelloWorld. Теперь я хочу использовать это для запуска программы, которая требует ввода данных пользователем. это может быть либо аргумент командной строки, либо входные данные, полученные через stdin.
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
public class CompileAndRun {
public static void main(String[] args) {
new CompileAndRun();
}
public CompileAndRun() {
try {
int result = compile("compileandrun/HelloWorld.java");
System.out.println("javac returned " + result);
result = run("compileandrun.HelloWorld");
} catch (IOException | InterruptedException ex) {
ex.printStackTrace();
}
}
public int run(String clazz) throws IOException, InterruptedException {
ProcessBuilder pb = new ProcessBuilder("java", clazz);
pb.redirectError();
pb.directory(new File("src"));
Process p = pb.start();
InputStreamConsumer consumer = new InputStreamConsumer(p.getInputStream());
consumer.start();
int result = p.waitFor();
consumer.join();
System.out.println(consumer.getOutput());
return result;
}
public int compile(String file) throws IOException, InterruptedException {
ProcessBuilder pb = new ProcessBuilder("javac", file);
pb.redirectError();
pb.directory(new File("src"));
Process p = pb.start();
InputStreamConsumer consumer = new InputStreamConsumer(p.getInputStream());
consumer.start();
int result = p.waitFor();
consumer.join();
System.out.println(consumer.getOutput());
return result;
}
public class InputStreamConsumer extends Thread {
private InputStream is;
private IOException exp;
private StringBuilder output;
public InputStreamConsumer(InputStream is) {
this.is = is;
}
@Override
public void run() {
int in = -1;
output = new StringBuilder(64);
try {
while ((in = is.read()) != -1) {
output.append((char) in);
}
} catch (IOException ex) {
ex.printStackTrace();
exp = ex;
}
}
public StringBuilder getOutput() {
return output;
}
public IOException getException() {
return exp;
}
}
}
3 ответа
На мой взгляд, лучшим решением является использование API компилятора Java 6. Вам также следует ознакомиться с документацией к пакету javax.tools.
Вы можете добавить аргументы командной строки, добавив еще одну строку в ProcessBuilder
конструктор как ProcessBuilder pb = new ProcessBuilder("java", clazz,"argument");
Вы должны использовать класс Runtime для этого.
файл кода --x.java для выполнения-y.java
Теперь вы должны использовать функцию "exec" класса Runtime.
как это
Процесс p=Runtime.getRuntime(). Exec("cmd /c javac y.java && java y.java");
так что теперь программа выполняется из.a процесса, созданного этим классом.
Этот метод возвращает процесс
поэтому, чтобы получить результат только что выполненной команды, сделайте так
p.getOutputStream() // оборачиваем этот outputStream в выводителе выходного потока или, может быть, пишущим устройством и читаем его до тех пор, пока он не станет нулевым
и, наконец, вывести его.