【发布时间】:2011-11-12 12:25:13
【问题描述】:
到此为止,我已经束手无策了。我确信这很简单,而且我对 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());
}
【问题讨论】:
-
我还试图从 ExecuteResultHandler 获取错误/输出/输入流并将其扔到 JTextPane 上。上面的方法有效还是您使用了 ExecuteResultHandler setOut/In/Error 来做到这一点?
-
这不是你,而是 Java :-) 在(POSIX)脚本中使用“反引号”,甚至在 C(或其他 POSIX 友好语言)中使用“反引号”,甚至在 C(或其他 POSIX 友好的语言)中出现什么是微不足道的,都是一种复杂的愚蠢行为在 Java 中。
标签: java apache-commons apache-commons-exec