我在这里束手无策。我确信这很简单,而且我对 Java 和流的理解很可能存在巨大的漏洞。我认为有这么多的类,我有点不知所措,试图通过 API 找出我想何时以及如何使用大量输入/输出流。
我刚刚了解了 apache commons 库的存在(自学 java 失败),目前正在尝试将我的一些 Runtime.getRuntime().exec 转换为使用 commons - exec。已经修复了一些每 6 个月出现一次的问题,然后解决 exec 的风格问题。
该代码执行 perl 脚本,并在脚本运行时在 GUI 中显示脚本的标准输出。
调用代码在 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”?),将其放入缓冲读取器中,然后将在那里循环直到缓冲区为空。
我不明白为什么这里不需要“等待”风格的命令?是否有可能在一段时间内缓冲区为空,退出循环并在进程仍在进行时继续?当我运行它时,情况似乎并非如此。
无论如何,我正在尝试使用 commons exec 获得相同的行为,基本上再次来自谷歌找到的代码:
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 对象获取输出,并用 perl 脚本的 stdout/err 中的字节填充我提供的 OutputStream?
如果是这样,您将如何获得上述行为以使其逐行流式传输输出?在示例中,人们向您展示了最后调用 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());
}