从另一个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)); } } 

如果我的第二个程序只有打印语句,则没有问题。 但是当我不得不从另一个人那里读到东西时,问题就出现了。

这有点奇怪,但你可以运行第二个程序而不需要它。 只需调用其中的main方法即可。 所以忘记运行时部分并执行此操作:

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

显然,你应该检查进程的返回结果,并且可以产生一个更好的机制来与进程交互,但这是基本的想法……

你可以调用第二类的main方法。 主要方法就像任何其他静态方法一样。

这对我有用:

 try { single.main(new String[0]); } catch (Exception e) { JOptionPane.showMessageDialog(null, e); }