`
vvggsky
  • 浏览: 65558 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java调用Oracle EXP备忘

    博客分类:
  • J2SE
阅读更多
http://www.blogjava.net/BlueDavy/archive/2006/11/22/82909.html

需求就是:
调用Oracle EXP命令完成备份,并返回生成的备份文件名,这个备份文件会很快在其他的地方被使用。
采用Runtime.getRuntime().exec我们都知道,需要处理它的InputStream,以避免出现执行的命令输出的信息过多使得进程被堵死.

InputStreamReader isr   =     new   InputStreamReader(process.getInputStream());
            BufferedReader br  =   new  BufferedReader(isr);


进程被挂S了,到底什么原因呢,开始瞎尝试,把读取process的InputStream的部分全部去掉,执行,竟然OK,更晕,但这个时候出现了一个问题,那就是没法知道什么时候备份文件完全生成了,如果在Runtime.getRuntime后去获取备份文件,那个时候甚至连备份文件都没生成,之后甚至尝试过轮询直到备份文件生成,再往下走,那样还是有问题,就是生成的那个备份文件永远都只有正常的一半的大小,只有在整个进程退出的时候它才正常的全部生成。

String[] cmds = new String[3];
        cmds[0] = "cmd";
        cmds[1] = "/C";
        cmds[2]=commandBuf.toString();
        Process process=Runtime.getRuntime().exec(cmds);
        boolean shouldClose=false;
        try {
            InputStreamReader isr = new InputStreamReader(process.getErrorStream());
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            while ((line = br.readLine()) != null){
                if(line.indexOf("错误")!=-1){
                    shouldClose=true;
                    break;
                }
            }
        } 
        catch (IOException ioe) {
            shouldClose=true;
        }
        if(shouldClose)
            process.destroy();
        int exitVal = process.waitFor();



说明什么呢,说明在执行oracle的exp时,出现了一个很怪的现象,就是exp在console输出的信息没有被放入InputStream,反而是放到了ErrorStream中(即使正确的情况也是),这就导致了按照正常的情况去写这段代码的话反而会出问题。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics