运行Runtime.getRuntime()。exec的问题

时间:2011-05-03 14:30:15

标签: java runtime.exec

我正在使用process = Runtime.getRuntime().exec(cmd,null,new File(path)); 在文件中执行一些SQL(abz.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;
}

2 个答案:

答案 0 :(得分:1)

显示的代码无法读取Process的错误流。这可能阻碍了进步。 ProcessBuilder是在Java 1.5中引入的,并且为redirectErrorStream()提供了一个方便的方法 - 因此只需要使用单个流。

有关更多一般提示,请阅读&实施When Runtime.exec() won't的所有建议。

答案 1 :(得分:0)

我在这里可以看到一些问题。您正在使用的'exec'版本将使用StringTokenizer对命令字符串进行标记,因此密码中的异常字符(如空格)或其他被替换的参数是等待发生的事故。我建议切换到版本

进程exec(String [] cmdarray,                     String [] envp,                     文件目录)              抛出IOException

使用它需要更多工作,但更强大。

第二个问题是关于exec是否与Java进程同时运行有各种警告(参见http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Process.html)。所以你需要说出你所使用的操作系统。如果它不同时运行,那么写入输出流的策略就不起作用了!

程序的最后一点写得相当模糊。我建议......

for (;;) {
    try {
        process.waitFor();
        return process.exitValue() == 0;
    } catch ( InterruptedException _ ) {
        System.out.println( "INTERRUPTED!" ); // Debug only.
    }
}

这消除了多余的变量result1,消除了多余的拳击并突出了无限循环的可能原因。

希望这会有所帮助&祝你好运!