我在这里的智慧结局。我确信这是一个简单的东西,我很可能有巨大的洞我的理解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());
}