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,消除了多余的装箱,并突出显示了无休止循环的可能原因


希望这有帮助&祝你好运out.close()
发生在
process.waitFor()之前,因此
OutputStream
没有被正确使用。