Java 运行Runtime.getRuntime().exec时出现问题
我使用的是Java 运行Runtime.getRuntime().exec时出现问题,java,runtime.exec,Java,Runtime.exec,我使用的是process=Runtime.getRuntime().exec(cmd,null,新文件(path)) 在文件(abz.SQL)中执行一些SQL 命令是: "sqlplus "+ context.getDatabaseUser() + "/" + context.getDatabasePassword() + "@" + context.getDatabaseHost() + ":" + con
process=Runtime.getRuntime().exec(cmd,null,新文件(path))代码>
在文件(abz.SQL)中执行一些SQL
命令是:
"sqlplus "+ context.getDatabaseUser() + "/"
+ context.getDatabasePassword() + "@"
+ context.getDatabaseHost() + ":"
+ context.getDatabasePort() + "/"
+ context.getSid() + " @"
+ "\""
+ script + "\"";
String path=context.getReleasePath()+ "/Server/DB Scripts";
它正在执行该文件,但没有退出。因此,我尝试使用:
Writer out = new OutputStreamWriter(process.getOutputStream());
out.append("commit;\r\n");
out.append("exit \r\n");
System.out.println("---------"+out);
out.close();
这是我正在使用的完整块:
if(context.getConnectionField()=="ORACLE")
{
String cmd=
"sqlplus "+ context.getDatabaseUser() + "/"
+ context.getDatabasePassword() + "@"
+ context.getDatabaseHost() + ":"
+ context.getDatabasePort() + "/"
+ context.getSid() + " @"
+ "\""
+ script +"\"";
String path=context.getReleasePath()+ "/Server/DB Scripts";
process = Runtime.getRuntime().exec(cmd,null,new File(path));
out = new OutputStreamWriter(process.getOutputStream());
out.append("commit;\r\n");
out.append("exit \r\n");
System.out.println("---------"+out);
out.close();
Integer result1 = null;
while (result1 == null) {
try {
result1 = process.waitFor();
}
catch (InterruptedException e) {}
}
if(process.exitValue() != 0)
return false;
return true;
}
显示的代码无法读取进程的错误流
。这可能会阻碍进展ProcessBuilder
是在Java 1.5中引入的,它有一个方便的方法来redirectErrorStream()
——因此只需要使用一个流
有关更多一般性提示,请阅读并实施的所有建议。我可以在这里看到一些问题。您正在使用的“exec”版本将使用StringTokenizer对命令字符串进行标记,因此密码中的异常字符(如空格)或其他被替换的参数都会发生意外。我建议换成这个版本
Process exec(字符串[]cmdarray,
字符串[]envp,
文件目录)
抛出IOException
使用它需要做更多的工作,但是更加健壮
第二个问题是,关于exec是否将与Java进程并发运行,存在各种各样的警告(请参阅)。所以你需要说明你使用的是哪个操作系统。如果它没有并发运行,那么写入输出流的策略就无法工作
程序的最后一部分写得相当模糊。我建议
for (;;) {
try {
process.waitFor();
return process.exitValue() == 0;
} catch ( InterruptedException _ ) {
System.out.println( "INTERRUPTED!" ); // Debug only.
}
}
这消除了多余的变量result1,消除了多余的装箱,并突出显示了无休止循环的可能原因
希望这有帮助&祝你好运如果你是认真的,请考虑别人如何阅读你的问题;你的问题格式不好,很难为其他人阅读。通常,这会导致低质量的答案或根本没有答案。如果你想正确回答你的问题,请试着相应地写下你的问题:)它以什么方式不起作用?你是没有得到你期望的结果,还是有例外等等?@krico:是的。我本来以为OP会这样做,但由于out.close()
发生在process.waitFor()之前,因此OutputStream
没有被正确使用。