通过Java进程向正在运行的JAR发送输入

通过Java进程向正在运行的JAR发送输入,java,jar,ipc,Java,Jar,Ipc,我想写一个程序来执行JAR并得到它们的输出。 当JAR程序只有一个print语句时,它可以正常工作,但当它在执行期间请求输入时,程序会冻结 JAR文件程序的代码: import java.util.*; public class demo { public static void main(String r[]) { Scanner sc = new Scanner(System.in); System.out.println("Hello ...")

我想写一个程序来执行JAR并得到它们的输出。 当JAR程序只有一个print语句时,它可以正常工作,但当它在执行期间请求输入时,程序会冻结

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文件的原始程序的代码:

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提供输入,但是我应该如何使用它才能创建一个可以同时向JAR提供输入和读取其输出的程序?

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

如果要在VM之外运行东西,请使用
ProcessBuilder
。对我来说很好,你可以继承IO流

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批处理脚本和路径。
(但还没有尝试输入)

为什么要从Java运行
jar
?为什么不将其加载到类路径中并简单地调用该方法呢?此外,如果您选择从Java运行外部程序,请使用新的而不是
Runtime.exec