0

通常当我这样做时:

printf 'select x from Y \ngo\n' | isql -Uxx -Pxxxxxx -Dxxxxx -w 65535 -s ','

在命令行上它执行得很好。

即使使用下面的java代码。它工作正常

public class test
{
 public static void main(String[] args)
 {
   String DB="|isql -Uxx -Pxxxxxx -Dxxxxx -w 65535 -s ','";
   String qpfx="printf \'";
   String qsfx=" \ngo\n\'";
   if(args[0]!=null)
        try {
            String cmd=qpfx+args[0]+qsfx+DB;
            System.out.println("argument query is:"+args[0]);
            System.out.println("Command is:"+cmd);

            Process p = Runtime.getRuntime().exec(new String[]{"sh","-c",cmd});

            p.waitFor();
            BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line=reader.readLine();

            while (line != null) {    
                System.out.println(line);
                line = reader.readLine();
            }

        }
        catch(IOException e1) {}
        catch(InterruptedException e2) {}

 }
}

我将在 java 代码上运行它,如下所示:

java test "select x from Y"

当我将选择查询作为“从 Y 中选择 *”而不是列名时,问题就来了。那是我想像下面这样执行的时候:

java test "select * from Y"

上面的jav代码挂了。任何人都可以告诉我原因吗?

下面是挂起的输出:

> java test "select * from Y"
argument query is:select * from Y
Command is:printf 'select * from Y
go
'|isql -Uxx -Pxxxxx -Dxxxxxx -w 65535 -s ','

我也试过:

java test "select \* from Y"

但它不执行。

4

1 回答 1

0

经过严格调试后,我发现挂起的线路是p.waitFor();.

我必须阅读这篇完整的文章,然后我终于找到了解决方案。我已经 p.waitFor();在代码中的while循环之后移动了它并且它起作用了。

于 2013-08-12T10:21:11.613 回答