我在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"传递给该程序。 该程序只接受字符串并显示
Your string is 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
对于记录,如果您在eclipse之外手动执行exe进程,它是否正常工作?
@TheCapn:执行正在使用和不使用eclipse,但我无法以两种方式传递任何参数
我怀疑问题在于您正在调用的程序。 你有源代码,还是黑盒操作?
我有源代码,但这是我项目的一部分。 无论如何,考虑一个基本程序,它从上面的程序接受参数"XYZ",只打印Your string is XYZ
我的观点是,如果您无法在eclipse之外(即通过终端)正确执行应用程序,则问题必须与您正在调用的程序有关。 我们之间有误会吗?
@TheCapn调用程序是完美的。 如果您查看上面的示例调用程序,如果行'String s = br.readLine();',我能够抓住参数。 写成`String s = args [0];'
您需要使用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.INHERIT的redirectError()和redirectOutput()方法导致输出只被发送到父Java进程。
甚至你的代码也不起作用。 我在我的问题(要调用的程序)中粘贴了一个非常简单的代码,它应该接受字符串"XYZ"并在我们的程序中显示输出"Your string is XYZ"
java 6版本对我也不起作用。
您将数据作为参数传递,但是从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]);
}
}
请务必同时检查InputStream和ErrorStream。
但是,如果您想通过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);
您正在执行语言编译器javac。我相信你想用你的main方法调用类文件上的java运行时。将javac替换为java,并指定主类。
哦对不起。 那是java那边。 不是javac。