process.waitFor() 不返回

process.waitFor() not returning

我想从 Postgres SQL 脚本迁移数据。 我正在使用下面的代码。

void importDatabase() {

        final Process process = Runtime.getRuntime().exec("psql -f ./test.sql postgresql://postgres:root@127.0.0.1:5432/testdb");

        //Wait to get exit value
        try {
            if (process.waitFor() != 0) {
                String line;
                BufferedReader input = new BufferedReader(new InputStreamReader(process.getErrorStream()));
                while ((line = input.readLine()) != null) {
                    log.error(line);
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
}

waitFor 没有返回任何东西,它只是永远等待。

注意:我的test.sql有很多查询,所以它会显示很多日志条目。

问题:

  1. 如何解决这个问题?

  2. 如果涉及到缓冲区内存,如何清除缓冲区?

谢谢。

如果由 Runtime.exec() 执行的进程产生输出 - stdoutstderr - 那么为了使其稳健运行,您需要在调用 Process.waitFor()。最有可能的是,您的 psql 进程被阻塞是因为它正在等待读取其输出的内容,而您直到 Process.waitFor() 完成后才开始这样做。

您可能需要在单独的线程中使用输出,除非您确切知道预期的输出是什么。在任何情况下,调用 psql 可能有问题,也可能没有问题——除非您捕获它的输出,否则您可能不知道。

Runtime.exec() 的稳健和便携使用非常困难。我已经详细地写了这个,这里有代码示例:

http://kevinboone.me/exec.html