【问题标题】:Using Runtime.getRuntime().exec in eclipse在 Eclipse 中使用 Runtime.getRuntime().exec
【发布时间】:2011-10-31 22:09:36
【问题描述】:

我在 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

但是通过使用线

字符串[] 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 并打印 Your string is XYZ

【问题讨论】:

  • 记录一下,如果您在eclipse之外手动执行exe进程它可以正常工作吗?
  • @TheCapn: 执行在有和没有 Eclipse 的情况下工作,但我无法以两种方式传递任何参数
  • 我怀疑问题出在您调用的程序上。你有源代码吗?或者它更像是一个黑盒操作?
  • 我确实有源代码,但这是我项目的一部分。无论如何考虑一个基本程序,它接受来自上述程序的参数“XYZ”并且只打印Your string is XYZ
  • 我的意思是,如果您无法在 Eclipse 之外正确执行应用程序(即通过您的终端),那么问题一定出在您正在调用的程序上。我们之间是不是有什么误会?

标签: java eclipse runtime.exec


【解决方案1】:

您需要使用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 进程。

【讨论】:

  • 即使您的代码也无法正常工作。我在我的问题(要调用的程序)中粘贴了一个非常简单的代码,它应该接受字符串“XYZ”并在我们的程序中显示输出"Your string is XYZ"
【解决方案2】:

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

【讨论】:

  • 抱歉。那是那里的java。不是 javac。
【解决方案3】:

您将数据作为参数传递,但从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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-09
    • 2015-08-28
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    相关资源
    最近更新 更多