通过Java进程向正在运行的JAR发送输入
我想写一个程序来执行JAR并得到它们的输出。 当JAR程序只有一个print语句时,它可以正常工作,但当它在执行期间请求输入时,程序会冻结 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 ...")
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
。