写入已打开终端的输入流

时间:2017-11-02 17:17:04

标签: java

我无法写入命令提示符,我可以通过ProcessBuilder打开。

我有以下内容:

public class Terminal {

    public static void main(String[] args) {

        List<String> launch = new ArrayList<String>();
        launch.add("cmd");
        launch.add("/c");
        launch.add("start");
        launch.add("cmd.exe");
        launch.add("/k");

        try {
            ProcessBuilder builder = new ProcessBuilder(launch);
            Process process = builder.start();
            OutputStream stdin = process.getOutputStream();
            InputStream stdout = process.getInputStream();

            BufferedReader r = new BufferedReader(new InputStreamReader(stdout));
            BufferedWriter w = new BufferedWriter(new OutputStreamWriter(stdin));

            w.write("dir");
            w.flush();
            w.close();

        }
        catch (IOException io) {
            io.printStackTrace();
        }

    }
}

这会成功打开一个新的Windows命令提示符。但它永远不会写dir。提示刚刚打开,只显示java Terminal发出的目录。

如何主动写入通过流程打开的终端?

修改 如果我将命令字符串列表更改为"cmd.exe /k start dir",那么新生成的命令提示符实际上会发出&#34; dir&#34;命令并在新终端中显示它。 我似乎无法找到正确的方式来访问流以向其写入新命令。

public class Terminal {

    public static void main(String[] args) {

        List<String> launch = new ArrayList<String>();
        launch.add("cmd");
        launch.add("/k");
        launch.add("start");
        launch.add("dir");

        try {
            Process p = new ProcessBuilder(launch).start();
        }
        catch (IOException io) {
            io.printStackTrace();
        }

    }
}

1 个答案:

答案 0 :(得分:2)

让我们看看cmd /c start cmd /k做了什么:

  • cmd /c启动命令提示符,执行以下命令,然后退出
  • start使用给定的命令
  • 生成一个新进程
  • cmd /k需要一个命令(你不提供),执行它,然后保持打开

所以:你开始cmd的两个实例。第二个实例使用start开始,它生成一个新进程。您希望"dir"出现在第二个进程中,而它正在写入第一个进程。不幸的是,第一个在调用start后立即终止,因为您使用/c启动了它。

尝试将/c更改为/k,然后"dir"应显示在第一个窗口中。