2012-02-21 134 views
2

如何使用Runtime.getRunTime.exec()发送和接收多个输入。使用java的交互式命令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? 

回答

1

为什么不使用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(); 
+0

这就是我试图做的,但它似乎是写工作不正常。我会用更多的解释来更新这个问题。 – boyco 2012-02-21 23:44:36

+1

不要忘记冲洗:) – james 2012-02-21 23:49:12

+1

这工作,我尝试使用冲洗前,但我想这么多不同的东西,我必须搞砸了别的东西,导致它不工作。谢谢! – boyco 2012-02-21 23:57:54