【问题标题】:Unable to send commands to CMD through Streams in java无法通过 java 中的 Streams 向 CMD 发送命令
【发布时间】:2017-02-01 17:48:03
【问题描述】:

我正在尝试通过 CMD 打开一个应用程序 (RCMIClient.exe)。我能够打开 CMD,但无法读取或向 CMD 写入命令。下面是代码,没有错误,它只是打开CMD,什么都不做,但是当我手动关闭CMD时,我得到了以下错误。

null
Exception in thread "main" 
java.io.IOException: Stream closed
at java.lang.ProcessBuilder$NullOutputStream.write(ProcessBuilder.java:433)
at java.io.OutputStream.write(OutputStream.java:116)
at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:295)
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:141)
at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229)
at java.io.BufferedWriter.flush(BufferedWriter.java:254)
at test.test.main(test.java:36)

代码:

public static void main(String[] args) throws IOException, InterruptedException {
    File f = new File("C:\\WDGSIMTools\\Anite\\RCMI\\Samples\\Release");
    ProcessBuilder pb = new ProcessBuilder("cmd.exe","/c","start").directory(f);
    pb.redirectErrorStream(true);
    Process p = pb.start();
    BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
    BufferedReader error = new BufferedReader(new InputStreamReader(p.getErrorStream()));
    StringBuilder output = new StringBuilder();
    String line;
    String errline;
    errline = error.readLine();
    System.out.println(errline);

    while((line=reader.readLine())!=null) {
        output.append(line);

    }
    //To test whether its reading CMD contents
    System.out.println(output);

    //send commands to CMD 
    writer.write("RCMIClient.exe"+"\n");
    writer.flush();
    writer.write("1"+"\n");
    writer.close();
    reader.close();


}

【问题讨论】:

    标签: java process stream


    【解决方案1】:

    cmd.exe /c start 将启动一个子进程然后关闭。

    您正在尝试将输入定向到原始 cmd(已关闭)。

    您应该调用cmd.exe /C RCMIClient.exe

    【讨论】:

    • 谢谢帕特里克。我进行了更改,它确实打开了应用程序,但在后台。你知道如何把它打到正手吗?
    • @Rajesh 在发送“1\n”后尝试使用 Process.waitFor
    • @Rajesh 这样看……当你运行这个java程序时,你已经在运行一个CLI应用程序了。所以如果你想显示子进程的输出,你应该通过重定向到 System.out 来实现。如果这还不够好并且必须在单独的窗口中,我想你可以这样做cmd.exe /C start java HelperProgram
    • 感谢 Patrick,实际上 "cmd.exe","/c","start","RCMIClent.exe" 有效。它弹出 CMD,我的应用程序正在等待 CMD 中的输入。
    猜你喜欢
    • 2014-04-22
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 2014-07-31
    相关资源
    最近更新 更多