使用java的交互式命令Runtime.getRunTime.exec()

如何使用Runtime.getRunTime.exec()发送和接收多个输入。

例如,如果我想运行诸如openSSL之类的东西来生成csr,它会询问诸如州,城市,公用名等内容。

Process p = Runtime.getRuntime().exec(cmd); OutputStream out = p.getOutputStream(); //print stuff p.getInputStream(); //Now i want to send some inputs out.write("test".getBytes()); //flush and close??? don't know what to do here //print what ever is returned //Now i want to send some more inputs out.write("test2".getBytes()); //print what ever is returned.. and so on until this is complete 

为什么不使用p.getInputStream()来读取你需要发送的内容,同时使用out.write()来相应地发送数据。

 Process p = Runtime.getRuntime().exec(cmd); OutputStream out = p.getOutputStream(); //print stuff p.getInputStream(); out.write("test".getBytes()); out.close(); //if i don't close, it will just sit there //print stuff p.getInputStream(); out.write("test".getBytes()); // I can no longer write at this point, maybe because the outputstream was closed? 

为什么不使用p.getInputStream().read()来读取你需要发送的内容,同时使用out.write()来相应地发送数据。

以下是一个示例: http : //www.rgagnon.com/javadetails/java-0014.html

 String line; OutputStream stdin = null; InputStream stderr = null; InputStream stdout = null; // launch EXE and grab stdin/stdout and stderr Process process = Runtime.getRuntime ().exec ("/folder/exec.exe"); stdin = process.getOutputStream (); stderr = process.getErrorStream (); stdout = process.getInputStream (); // "write" the parms into stdin line = "param1" + "\n"; stdin.write(line.getBytes() ); stdin.flush(); line = "param2" + "\n"; stdin.write(line.getBytes() ); stdin.flush(); line = "param3" + "\n"; stdin.write(line.getBytes() ); stdin.flush(); stdin.close(); // clean up if any output in stdout BufferedReader brCleanUp = new BufferedReader (new InputStreamReader (stdout)); while ((line = brCleanUp.readLine ()) != null) { //System.out.println ("[Stdout] " + line); } brCleanUp.close(); // clean up if any output in stderr brCleanUp = new BufferedReader (new InputStreamReader (stderr)); while ((line = brCleanUp.readLine ()) != null) { //System.out.println ("[Stderr] " + line); } brCleanUp.close();