理论不懂就实践,实践不会就学理论!
一眼看过去相信大家都知道用Runtime.getRuntime().exec来调用,我的需求就是:调用Oracle EXP命令完成备份,并返回生成的备份文件名,这个备份文件会很快在其他的地方被使用。采用Runtime.getRuntime().exec我们都知道,需要处理它的InputStream,以避免出现执行的命令输出的信息过多使得进程被堵死,OK,按照这样的方法,开写:
posted on 2006-11-22 22:43 BlueDavy 阅读(7701) 评论(8) 编辑 收藏 所属分类: Java
从没写过有关process的东西,学习! 回复 更多评论
正如你所说的,处理Process的时候要注意及时读取子进程的输出流,不然可能导致子进程堵塞,甚至死锁。 如果我是你,我会这么来排除bug。 1,把对InputStream的处理放到一个单独Thread里面。 2,用ProcessBuilder的redirectErrorStream来合并OutputStream和ErrorStream。注意子进程的InputStream对应父进程的OutStream。如果不合并这两个流的话则必须并行排空它们,顺序的排空会导致思索。 建议你好好看看5.0的API和JLS。 回复 更多评论
@kruce[匿名] ....我用的是1.4....虽然我也很想用5.0的ProcessBuilder 回复 更多评论
我也遇到你这样的问题,不过我还是用getInputStream()才可以,用getErrorStream我也试了一下,只能倒入300条数据就卡住了. 回复 更多评论
我今天遇到这个问题了 回复 更多评论
Win的控制台程序和UNIX下的命令执行完毕后,都会有一个出口值(EXIT CODES),如果执行成 功的话,这个值一般为0,不成功则为其它值。在Windows下,可以在程序执行完毕后,马上输入 echo %ERRORLEVEL%查看这个值;在Unix下则是输入 echo $?。实质上都是保存在一个环境变量 中。 在Java中通过Process来运行外部程序的时候,可以调用Process的exitValue()方法来获得程序 的出口值。Oracle的exp和imp在各种情况下的出口值如下: A. Successful export/import. ------------------------- Result : Export terminated successfully without warnings Import terminated successfully without warnings Exit Code : EX_SUCC Exit Level: 0 B. Successful export/import with warnings. --------------------------------------- Result : Export terminated successfully with warnings Import terminated successfully with warnings Exit Code : EX_OKWARN Exit Level: 0 (for Unix platforms) 1 (for Windows platform with Oracle9i, Oracle8i, and below) 3 (for Windows platform with Oracle10g and higher) C. Unsuccessful export/import. --------------------------- Result : Export terminated unsuccessfully Import terminated unsuccessfully Exit Code : EX_FAIL Exit Level: 1 (for Unix platforms, and for Windows platforms with Oracle10g and higher) 3 (for Windows platform with Oracle9i, Oracle8i, and below) 回复 更多评论
exp和imp的输出是要从ErrorStream中获取,这是我以前写的 Process proc = null; try { proc = Runtime.getRuntime().exec(cmd.toString()); InputStream istr = proc.getErrorStream(); BufferedReader br = new BufferedReader(new InputStreamReader(istr)); String str; while ((str=br.readLine()) != null) { errorInfo.append(str + "\n"); } proc.waitFor(); } catch (Exception e) { ... } if (proc.exitValue() == 0) { proc.destroy(); return true; } else { if(logger.isDebugEnabled()) logger.debug(errorInfo); proc.destroy(); return false; } 回复 更多评论
非常感谢这篇文章,着实很难解决 回复 更多评论