在java中创建一个始终保持活动状态的进程

c2e8gylq  于 2022-10-30  发布在  Java
关注(0)|答案(1)|浏览(153)

我创建了一个类来连续执行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响应

idv4meu8

idv4meu81#

你需要重新组织你的代码。因为你在循环中有一个try with resources块,所以子进程终止了:

try(PrintWriter stdin = new PrintWriter(Handle.getOutputStream())) {

    stdin.write(getCommand.nextLine()+System.lineSeparator());
    stdin.flush();
}

以上表示子进程的STDIN在一行后结束,CMD.EXE也是如此。
另请注意,仅将PrintWriter stdin部分移出循环是不够的。您将无法在同一循环中可靠地提供STDIN和读取STDOUT,因为STDOUT可能是多行输入,并在您写入STDIN时阻塞进程。
修复很简单,创建一个后台线程来写入STDIN或读取STDOUT。

相关问题