我正在使用流程构建器执行一个简单的jar文件。 jar文件通过要求用户输入数字来简单地计算数字的平方。我可以在控制台输入一个数字,但程序挂起。如何将此(数字)传递回进程构建器,以便由jar文件计算其正方形?
这是我的代码:
public static void executeSystemCommand(String... args) {
try {
ProcessBuilder pb = new ProcessBuilder(args);
pb.redirectErrorStream(true);
Process proc = pb.start();
Reader reader = new InputStreamReader(proc.getInputStream());
int ch;
while ((ch = reader.read()) != -1) {
System.out.print((char) ch);
}
reader.close();
Scanner scan = new Scanner(System.in);
int k = scan.nextInt();
proc.getOutputStream().write(k);
proc.getOutputStream().close();
while ((ch = reader.read()) != -1) {
System.out.print((char) ch);
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
}
答案 0 :(得分:2)
这是一个代码,它将字符串b输入到jar文件,并根据从jar文件接收的输出返回布尔语的arraylist。
public ArrayList<Boolean> pro(String b) throws IOException, Exception {
ArrayList<Boolean> ar = new ArrayList<Boolean>();
try {
ProcessBuilder pb = new ProcessBuilder("java", "-jar",
"myjar.jar");
pb.directory(new File("path to myjar"));
Process proc = pb.start();
Scanner in = new Scanner(proc.getInputStream());
PrintWriter out = new PrintWriter(proc.getOutputStream());
// Read user input
out.println(b);
out.flush();
String response = new String();
// Read the response
for (int i = 0; i < b.length(); i++)
response = in.nextLine();
in.close();
out.close();
StringTokenizer st = new StringTokenizer(response);
while (st.hasMoreTokens()) {
String bol = st.nextToken();
if (bol.equals("true"))
ar.add(true);
else
ar.add(false);
}
} catch (IOException e) {
e.printStackTrace();
}
return ar;
}
答案 1 :(得分:0)
Here是我尝试过的一些示例代码。
该程序使用ProcessBuilder
启动外部流程。它还产生了两个新线程:
output
&amp;新进程的error
个流并将其写入程序的System.out
System.in
上写的所有内容复制到新流程的input
流中这很好用,但是我遇到了一些麻烦,让你停止从System.in
读取的线程正常关闭。我无法找到一种方法来中断从System.in
读取时阻塞的线程,所以我通过将线程设置为守护进程来解决它。
以下是关于这些主题的几个好资源: