我在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:/用户/..../工作区/测试/ 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
答案 0 :(得分:3)
您需要使用Process
和getInputStream()
从getErrorStream()
读取输出(和错误)流。如果您想等待该过程完成,则需要一个单独的线程。
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();
带有redirectError()
的{{1}}和redirectOutput()
方法会导致输出只被发送到父Java进程。
答案 1 :(得分:0)
您正在执行语言编译器javac
。我相信你想用你的main方法调用类文件上的java运行时。将javac
替换为java
,并指定您的主要课程。
答案 2 :(得分:0)
您将数据作为参数传递,但是从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);