在eclipse中使用Runtime.getRuntime()。exec

我在eclipse中使用Runtime.getRuntime()。exec从当前程序运行另一个java程序。 我使用了以下代码。

InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); System.out.println("Enter the class name"); String s=br.readLine(); String str="XYZ"; String[] cmd = {"java","-cp", "C:/Users/..../workspace/Testing/bin",s,str}; Process pro=Runtime.getRuntime().exec(cmd); 

我也将一个字符串“XYZ”传递给该程序。 该程序只接受字符串并显示

你的字符串是XYZ

但通过使用该线

String [] cmd = {“java”,“ – cp”,“C:/ Users /…./ workspace / Testing / bin”,s,str};

我能够运行该程序,但它不接受任何参数。 它既不显示输出也不显示任何错误。

我哪里错了?

考虑要调用的程序是

 import java.io.*; public class Test { public static void main(String[] args) throws IOException { InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); System.out.println("Enter any string"); String s=br.readLine(); System.out.println("Your string is "+s); } } 

此程序应接受字符串XYZ并打印您的字符串是XYZ

您需要使用getInputStream()getErrorStream()Process读取输出(和错误)流。 如果您想等待该过程完成,则需要一个单独的线程。

 String[] cmd = {"java", "-cp", "C:/Users/..../workspace/Testing/bin", s, str}; Process p = new ProcessBuilder(cmd).redirectErrorStream(true).start(); final InputStream pOut = p.getInputStream(); Thread outputDrainer = new Thread() { public void run() { try { int c; do { c = pOut.read(); if (c >= 0) System.out.print((char)c); } while (c >= 0); } catch (IOException e) { e.printStackTrace(); } } }; outputDrainer.start(); p.waitFor(); 

如果您正在使用Java 7并希望将进程的所有输出重定向到控制台,则代码相当简单:

 String[] cmd = {"java", "-cp", "C:/Users/..../workspace/Testing/bin", s, str}; Process p = new ProcessBuilder(cmd).redirectError(Redirect.INHERIT) .redirectOutput(Redirect.INHERIT) .start(); p.waitFor(); 

带有Redirect.INHERITredirectError()redirectOutput()方法导致输出只被发送到父Java进程。

您正在执行语言编译器javac 。 我相信你想用你的main方法在类文件上调用java运行时。 用java替换javac ,并指定主类。

您将数据作为参数传递,但从System.in读取它。 如果您从参数中读取数据,它将起作用。 那么做@prunge所说的捕获子进程打印的内容并将其用作测试,一切都会正常工作。

 import java.io.*; public class Test { public static void main(String[] args) throws IOException { if(args.length==0) System.out.println("No String received"); else System.out.println("Your string is " + args[0]); } } 

确保同时检查InputStreamErrorStream

但是,如果您想通过System.in传递数据,则必须将呼叫代码更改为:

 InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); System.out.println("Enter the class name"); String s=br.readLine(); String str="XYZ"; String[] cmd = {"java","-cp", "C:/Users/..../workspace/Testing/bin",s}; Process pro=Runtime.getRuntime().exec(cmd); PrintWriter output= new PrintWriter(pro.getOutputStream()); output.println(str);