2015-04-23 25 views
2

我想编写一个程序来执行JAR并获取它们的输出。 当JAR程序只有一个打印语句时它可以正常工作,但是当它在执行过程中要求输入时,程序会冻结。通过Java进程将输入发送到正在运行的JAR

代码的JAR文件程序:

public class jartorun { 
    public static void main(String arg[]) throws IOException { 
     String t = "javaw -jar D:\\jarcheck\\temp.jar"; 
     Process p = Runtime.getRuntime().exec(t); 
     BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     String line = ""; 
     while ((line = input.readLine()) != null) { 
      System.out.print(line + "\n"); 
     } 
     input.close(); 
    } 
} 

我可以使用process.getOutputStream()给输入JAR,但我会​​怎样:

import java.util.*; 

public class demo { 

    public static void main(String r[]) { 
     Scanner sc = new Scanner(System.in); 
     System.out.println("Hello ..."); 
     System.out.println("please enter the number :"); 
     int i = sc.nextInt(); 
     System.out.println(" number : " + i); 

    } 
} 

它运行的JAR文件的原始程序代码使用它,所以我可以创建一个程序,可以给JAR输入并同时读取其输出?

+0

你为什么从Java运行'jar'?为什么不把它加载到类路径中并简单地调用该方法?此外,如果您选择从Java运行外部程序,请使用新的['ProcessBuilder'](http://stackoverflow.com/questions/6856028/difference-between-processbuilder-and-runtime-exec)而不是'Runtime .exec'。 –

回答

0

如果你想运行虚拟机之外的东西,请使用ProcessBuilder。对我来说工作得很好,你可以继承IO Stream。

ProcessBuilder builder = new ProcessBuilder("./script.sh", 
          "parameter1"); 
      builder.directory(new File("/home/user/scripts/")); 
      builder.inheritIO(); 

      try { 
        Process p = builder.start(); 
        p.waitFor(); 
        // Wait for to finish 
      } catch (InterruptedException e) { 
        e.printStackTrace(); 
      } catch (IOException ioe) { 
        ioe.printStackTrace(); 
      } 

这应该也适用于Windows批处理脚本和路径。 (还没有尝试输入)

0

您可以使用p.getOutputStream()为启动的过程提供输入。

相关问题