2011-10-31 90 views
2

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

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,并打印你的字符串是XYZ

+0

为了记录在案,如果你手工执行Eclipse外的exe进程是否能够正常工作? – Grambot

+0

@TheCapn:执行正在和没有日食,但我不能通过任何参数在两种方式 – Anil

+0

我怀疑这个问题是你正在调用的程序。你有源代码吗?还是更多的黑盒操作? – Grambot

回答

0

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

+0

哦对不起。那是那边的java。不是javac。 – Anil

3

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

redirectError()redirectOutput()方法与Redirect.INHERIT原因输出只是被发送到父Java进程。

+0

即使你的代码不工作。我在我的问题(要调用的程序)中粘贴了一个非常简单的代码,它应该接受字符串“XYZ”,并在我们的程序 – Anil

+0

中显示输出'“您的字符串是XYZ”'java 6版本不起作用对我来说也是。 – alexsb

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); 
相关问题