Запуск java-программы из другой java-программы

Я работаю над простой java-программой. Он просто компилирует и выполняет другую java-программу. Я использую функцию Runtime.exec () для компиляции и запуска. Нет проблем с компиляцией. но когда он запускается, если второй программе нужен ввод для чтения с клавиатуры, я не могу дать его из мастер-процесса. Я использовал функцию getOutputStream (). но это не помогло. Я предоставлю свой код.

public class sam { public static void main(String[] args) throws Exception { try { Process p = Runtime.getRuntime().exec("javac sam2.java"); Process p2 = Runtime.getRuntime().exec("java sam2"); BufferedReader in = new BufferedReader( new InputStreamReader(p2.getInputStream())); OutputStream out = p.getOutputStream(); String line = null; line = in.readLine(); System.out.println(line); input=input+"\n"; out.write(input.getBytes()); p.wait(10000); out.flush(); }catch (IOException e) { e.printStackTrace(); } } } 

Это моя основная программа (sam.java).

Ниже приведен код sam2.java

 public class sam2 { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str; System.out.println("Enter the number..\n"); str = br.readLine(); System.out.println(Integer.parseInt(str)); } } 

Нет проблем, если моя вторая программа имеет только инструкции для печати. Но проблема возникает, когда я должен что-то читать из другого.

Это немного странно, но вы можете запустить вторую программу, не открывая ее. Просто назовите основной метод. Поэтому забудьте раздел времени выполнения и выполните следующее:

 sam2.main(new String[0]); 

Конечно, таким образом вы должны скомпилировать sam2 во время компиляции

Каждый процесс должен быть разрешен для запуска и завершения. Для этой цели вы можете использовать Process#waitFor . В равной степени вам необходимо одновременно использовать любой результат процесса. waitFor будет блокироваться, поэтому вам понадобится использовать Thread для чтения ввода (и если вам нужно, напишите вывод в процессе)

В зависимости от местоположения файла java / class вам может также потребоваться указать начальную папку, с которой может начаться выполнение процесса.

Большая часть этого значительно проще с помощью ProcessBuilder

 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; } } } 

Теперь, очевидно, вы должны проверить результаты возврата процессов и, возможно, создать лучший механизм для взаимодействия с процессами, но это основная идея …

Вы можете просто вызвать основной метод второго classа. Основной метод аналогичен любому другому статическому методу.

Это то, что сработало для меня:

 try { single.main(new String[0]); } catch (Exception e) { JOptionPane.showMessageDialog(null, e); } 
  • использовать оболочку java-ffmpeg или просто использовать java runtime для выполнения ffmpeg?
  • Runtime.getRuntime (). Exec ()
  • Как выполнить команду с параметрами?
  • как скомпилировать и запустить java-программу в другой Java-программе?
  • Запуск командной строки в Java
  • Как использовать команду «cd» с использованием времени выполнения Java?
  • читать вывод из java exec
  • Java Runtime.getRuntime (). Exec () альтернативы
  • Как заставить трубы работать с Runtime.exec ()?
  • Давайте будем гением компьютера.