尝试启动执行EXPDP命令以进行Oracle DB备份的进程时遇到了一些问题。
这是启动进程的方法,问题是当我尝试从stInput和stdError读取时。这个过程永远挂起,如果我停止调试以查看运行时执行的位置,我得到的行是:
FileInputStream.readBytes(byte[], int, int) line: not available [native method]
在方法入口点,cmdCommand参数的值为:
"EXPDP system/syspwd@orcl DIRECTORY=DATA_PUMP_DIR SCHEMAS=fabro DUMPFILE=backupFabro.dmp LOGFILE=backupFabro.log"
方法如下,它挂在第一个while
循环上。
public Boolean cmdCommand(String cmdCommand) throws IOException{
logger.info("**************************************");
logger.info("Esecuzione comando:");
logger.info(cmdCommand);
logger.info("**************************************");
final Process p = Runtime.getRuntime().exec(cmdCommand);
Boolean end = false;
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
String line = null;
try {
while ((line = stdInput.readLine()) != null) {
logger.info(line);
}
while((line= stdError.readLine()) != null){
logger.error(line);
}
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
finally{
stdError.close();
stdInput.close();
}
try {
if(p.waitFor() != 0){
logger.error("error etc etc");
}
else{
end = true;
logger.info("success ecc ecc");
}
} catch (Exception e) {
logger.error(e.getMessage(), e);
p.destroy();
}
return end;
}
答案 0 :(得分:0)
尝试使用.ready()函数。
try {
if (stdError.ready())
{
while((line= stdError.readLine()) != null){
logger.error(line);
}
}
}
对stdout执行相同的操作。
它对我来说就像一个魅力。