java exec示例_java – 从apache-commons exec处理输出

这篇博客探讨了在Java中使用Runtime.getRuntime().exec()方法执行外部进程时遇到的问题,以及如何转向Apache Commons Exec库以更优雅地处理输出。作者展示了如何使用PumpStreamHandler来实时捕获和显示Perl脚本的stdout。博客内容包括旧代码示例和新代码示例,解释了在不使用'waitFor()'的情况下如何避免丢失输出,并讨论了如何实时显示执行过程中的输出。
摘要由CSDN通过智能技术生成

我在这里的智慧结局。我确信这是一个简单的东西,我很可能有巨大的洞我的理解java和流。我认为有这么多的类,我有点不知所措,试图通过API,弄清楚何时,如何我想使用大量的输入/输出流。

我刚刚学习了apache commons库的存在(自学java失败),并且目前正试图转换我的一些Runtime.getRuntime()。exec使用commons – exec。已经固定的一些每6个月一次这个问题出现了,然后消失了与exec的风格问题。

该代码执行perl脚本,并在GUI中显示来自脚本的stdout,因为它正在运行。

调用代码在swingworker里面。

我迷路了如何使用pumpStreamHandler …反正这里是旧的代码:

String pl_cmd = "perl script.pl"

Process p_pl = Runtime.getRuntime().exec( pl_cmd );

BufferedReader br_pl = new BufferedReader( new InputStreamReader( p_pl.getInputStream() ) );

stdout = br_pl.readLine();

while ( stdout != null )

{

output.displayln( stdout );

stdout = br_pl.readLine();

}

我想这是我得到的复制粘贴代码我不完全明白很久以前。上面我假设执行过程,然后抓住输出流(通过“getInputStream”?),将它放入一个缓冲读取器,然后将循环,直到缓冲区为空。

我没有得到的是为什么不需要一个’waitfor’风格的命令在这里?是不是有可能有一些时间,其中的缓冲区将是空的,退出循环,并继续,而进程仍在?当我运行它,似乎不是这样的情况。

在任何情况下,我试图得到相同的行为使用commons exec,基本上再次从google发现代码:

DefaultExecuteResultHandler rh = new DefaultExecuteResultHandler();

ExecuteWatchdog wd = new ExecuteWatchdog( ExecuteWatchdog.INFINITE_TIMEOUT );

Executor exec = new DefaultExecutor();

ByteArrayOutputStream out = new ByteArrayOutputStream();

PumpStreamHandler psh = new PumpStreamHandler( out );

exec.setStreamHandler( psh );

exec.setWatchdog( wd );

exec.execute(cmd, rh );

rh.waitFor();

我想弄清楚什么pumpstreamhandler在做什么。我假设这将从exec对象的输出,并填充OutputStream我提供它的字节从perl脚本的stdout / err?

如果是这样,你将如何获得上述行为让它流输出行一行?在示例中,人们在结束时显示调用out.toString(),并且我认为这只会在脚本运行完成后转发脚本的所有输出。你会怎么做,它会显示输出,因为它是逐行运行?

————未来编辑———————

发现这通过谷歌和工作好,以及:

public static void main(String a[]) throws Exception

{

ByteArrayOutputStream stdout = new ByteArrayOutputStream();

PumpStreamHandler psh = new PumpStreamHandler(stdout);

CommandLine cl = CommandLine.parse("ls -al");

DefaultExecutor exec = new DefaultExecutor();

exec.setStreamHandler(psh);

exec.execute(cl);

System.out.println(stdout.toString());

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值