用Java启动外部程序并管理它的输出

时间:2009-09-08 12:53:16

标签: java

这看起来有点尴尬但是我想在Java中启动一个控制台程序,但是在它自己的窗口中,同时使用tee将输出保存在日志文件中。我正在将执行此操作的程序从Perl移植到Java,并且在使用大量命令argumments启动程序时遇到问题。在Perl中,它使用

system("dtterm -title $title -e /usr/bin/ksh -c \"".
"cd $dir; ./$exec $arg | tee $exec.log \" &");

我正在尝试使用ProcessBuilder类来做同样的事情。

ProcessBuilder builder = new ProcessBuilder("dtterm", "-title", title, "-e",
"/usr/bin/ksh", "-c" "./" + exec, arg, "|", "tee", exec + ".log");
builder.directory(dir);
Process process = builder.start();

在执行此操作时,进程启动,它也不会进入日志文件,但它来自Perl。我已尝试使用builder.getInputStream()方法,但由于它显示在dtterm窗口中,因此out流程没有输出。

我需要拥有单独的窗口,因为程序会同时启动多个不同的程序,每个程序都有自己的窗口。我确实尝试直接启动它并将所有进程的输出发送到我的程序标准输出,但是有太多,它需要保持独立。如果没有办法做到这一点,那么我将不得不制作一个显示程序输出的JFrame,但如果可能的话我想避免这种情况。

由于

1 个答案:

答案 0 :(得分:1)

你需要以不同的方式建立你的命令。你想要的是:

dtterm -title <title> -e /usr/bin/ksh -c "./<exec> arg | tee <exec>.log"

(请注意ksh参数的引号。)您需要在代码中复制它:

ProcessBuilder builder = new ProcessBuilder("dtterm", "-title", title, "-e", "/usr/bin/ksh", "-c", "./" + exec + " arg + " | tee " + exec + ".log");

是的,这看起来非常难看,如果它包含空格或引号等特殊字符,您必须注意正确转义exec