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

时间:2011-10-31 22:09:36

标签: java eclipse runtime.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:/用户/..../工作区/测试/ 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

3 个答案:

答案 0 :(得分:3)

您需要使用ProcessgetInputStream()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]);    
    }
}

请务必同时检查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);