我创建了一个类来连续执行CMD命令。在下面的代码中,第一次迭代运行良好,但问题是在一次迭代完成后,进程就停止了。
class CommandLine{
Process Handle ;
OutputStreamWriter writer;
Scanner getCommand;
Socket socket;
public CommandLine(Socket socket) throws IOException {
this.socket = socket;
}
public void executeCommand() {
try {
getCommand = new Scanner(socket.getInputStream()).useDelimiter("\\A");
Handle = new ProcessBuilder("cmd.exe").redirectErrorStream(true).start();
while(getCommand.hasNextLine()) {
try(PrintWriter stdin = new PrintWriter(Handle.getOutputStream())) {
stdin.write(getCommand.nextLine()+System.lineSeparator());
stdin.flush();
}
if(Handle.getInputStream().read()>0) {
Scanner result = new Scanner(Handle.getInputStream()).useDelimiter("\\A");
while(result.hasNextLine()) {
System.out.print(result.nextLine()+"\n");
}
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
thx响应
1条答案
按热度按时间idv4meu81#
你需要重新组织你的代码。因为你在循环中有一个try with resources块,所以子进程终止了:
以上表示子进程的STDIN在一行后结束,CMD.EXE也是如此。
另请注意,仅将
PrintWriter stdin
部分移出循环是不够的。您将无法在同一循环中可靠地提供STDIN和读取STDOUT,因为STDOUT可能是多行输入,并在您写入STDIN时阻塞进程。修复很简单,创建一个后台线程来写入STDIN或读取STDOUT。