Java process.waitFor()未返回

Java process.waitFor()未返回,java,postgresql,exec,Java,Postgresql,Exec,我想从Postgres SQL脚本迁移数据。 我正在使用下面的代码 void importDatabase(){ 最终进程进程=Runtime.getRuntime().exec(“psql-f./test.sqlpostgresql://postgres:root@127.0.0.1:5432/testdb”); //等待获取退出值 试一试{ if(process.waitFor()!=0){ 弦线; BufferedReader输入=新的BufferedReader(新的InputStrea

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

void importDatabase(){
最终进程进程=Runtime.getRuntime().exec(“psql-f./test.sqlpostgresql://postgres:root@127.0.0.1:5432/testdb”);
//等待获取退出值
试一试{
if(process.waitFor()!=0){
弦线;
BufferedReader输入=新的BufferedReader(新的InputStreamReader(process.getErrorStream());
而((line=input.readLine())!=null){
日志错误(行);
}
}
}捕捉(中断异常e){
e、 printStackTrace();
}
}
waitFor
没有返回任何内容,它只是永远等待

注意:My
test.sql
有许多查询,因此它将显示许多日志条目

问题:

  • 如何解决这个问题

  • 如果这与缓冲区内存有关,如何清除缓冲区


  • 谢谢。

    如果由
    Runtime.exec()
    执行的进程产生输出(到
    stdout
    stderr
    ),那么要使其稳健运行,您需要在调用
    process.waitFor()之前开始使用输出。最可能的情况是,您的
    psql
    进程被阻塞,因为它正在等待读取其输出的内容,而您要等到
    process.waitFor()完成后才能开始执行该操作

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

    使用
    Runtime.exec()
    的健壮性和可移植性令人惊讶地困难。我在这里详细介绍了这一点,并提供了代码示例:


    如果由
    Runtime.exec()
    执行的进程产生输出(到
    stdout
    stderr
    ),则要使其稳健运行,您需要在调用
    process.waitFor()
    之前开始使用输出。最可能的情况是,您的
    psql
    进程被阻塞,因为它正在等待读取其输出的内容,而您要等到
    process.waitFor()完成后才能开始执行该操作

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

    使用
    Runtime.exec()
    的健壮性和可移植性令人惊讶地困难。我在这里详细介绍了这一点,并提供了代码示例: