Java spawn终端读取其stdin

Java spawn终端读取其stdin,java,linux,bash,unix,Java,Linux,Bash,Unix,我正在编写(在linux或windows+cygwin下)一个java程序,该程序需要运行一个命令(进程P1)并读取其标准输出(它主要是对我的程序有用的二进制数据)。这很容易做到,而且已经做到了 问题是P1也会在stderr上打印一些状态信息,我希望生成一个终端(比如xterm)以用户可读的方式显示它。 有什么简单的方法可以做到这一点吗 我考虑过只将stderr的输出提供给一些JTextArea的选项,但是这个程序使用了特殊的控制字符(特别是擦除最后一行)。不幸的是,我找不到任何免费的“终端(J

我正在编写(在linux或windows+cygwin下)一个java程序,该程序需要运行一个命令(进程P1)并读取其标准输出(它主要是对我的程序有用的二进制数据)。这很容易做到,而且已经做到了

问题是P1也会在stderr上打印一些状态信息,我希望生成一个终端(比如xterm)以用户可读的方式显示它。 有什么简单的方法可以做到这一点吗

我考虑过只将stderr的输出提供给一些JTextArea的选项,但是这个程序使用了特殊的控制字符(特别是擦除最后一行)。不幸的是,我找不到任何免费的“终端(J)组件”

因此,最简单的方法是能够打开一个xterm(P2),在窗口中显示到其stdin的所有内容,并启动一个java线程在循环err.read(P1)->in.write(P2)中执行,以将所有内容从stderr(P1)传输到stdin(P2)。
另一个选择是能够启动类似“xterm-ep1_命令”的东西,并且仍然能够捕获P1 stdout

非常感谢你的帮助


PS:我希望尽可能保持可移植性,因此我不确定进入/dev/pts是一个好主意

如果不完全理解您的问题,我能想到的最简单的解决方案是这样的(bash将用当前进程ID替换$$,使其半唯一)。我也不知道这在cygwin是否有效

mkfifo /tmp/myoutput.$$
trap "rm /tmp/myoutput.$$" EXIT

xterm -e cat /tmp/myoutput.$$ &

runProgram 2>/tmp/myoutput.$$
这将把stderr转储到fifo,由xterm中的cat读取

请注意,每当您关闭fifo时,cat就会退出,因此如果您正在生成多个进程实例,那么您将需要一些其他控制机制,然后可能有其他更简单的方法来解决它。例如,首先在一个xterm中运行整个程序(包括java程序),但我想这是不可能的,因为某些原因,或者您已经尝试过了

编辑:
我认为最常见的方法是将信息转储到日志文件中,然后
tail
it,如下所示:

touch /tmp/myprogram.log
xterm -e tail -f /tmp/myprogram.log &
runProgram 2>/tmp/myprogram.log
这应该总是有效的,但是如果tail启动太慢,您可能会丢失日志消息(在tail中查找标志以在跟踪之前回显整个文件)。将它与陷阱(和“唯一”文件名)结合起来删除文件,您就不必担心清理了


不在xterm中运行整个应用程序的原因是什么?

我找到了mkfifo选项,但正如您所说,这可能不是“更简单”(更好?:-)的方式。。。(尽管如此,我还是喜欢你关于陷阱的想法!)此外,尽管mkfifo存在于cygwin中,但它是否保证以“可移植”的方式工作?…你不能在xterm中运行整个应用程序吗?“xterm-e tail”:这似乎是个好主意(奇怪的是我没有想到它…)。我不确定它将如何与windows+cygwin配合使用,但这至少是一个良好的开端。>“没有在xterm中运行整个应用程序的原因是什么?”:很简单:主应用程序已经在运行,并且它启动了一个进程。此过程从USB探测器读取一些数据,通过主应用程序的stdout发送数据(二进制),并将状态(连接状态、探测器缓冲区状态、字节读取/秒…)打印到stderr,以便用户也可以跟踪发生的情况(尤其是我们经常要处理的缓冲区溢出…)