我无法写入命令提示符,我可以通过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();
}
}
}
答案 0 :(得分:2)
让我们看看cmd /c start cmd /k
做了什么:
cmd /c
启动命令提示符,执行以下命令,然后退出。start
使用给定的命令cmd /k
需要一个命令(你不提供),执行它,然后保持打开 所以:你开始cmd
的两个实例。第二个实例使用start
开始,它生成一个新进程。您希望"dir"
出现在第二个进程中,而它正在写入第一个进程。不幸的是,第一个在调用start
后立即终止,因为您使用/c
启动了它。
尝试将/c
更改为/k
,然后"dir"
应显示在第一个窗口中。