Java process.waitFor()未返回
我想从Postgres SQL脚本迁移数据。 我正在使用下面的代码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
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
没有返回任何内容,它只是永远等待
注意:Mytest.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()
的健壮性和可移植性令人惊讶地困难。我在这里详细介绍了这一点,并提供了代码示例: