gpt4 book ai didi

java - 生成终端读取其标准输入

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:30:21 26 4
gpt4 key购买 nike

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

问题是 P1 还在 stderr 上打印了一些状态信息,我想生成一个终端(如 xterm)以用户可读的方式显示它。有什么简单的方法吗?

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

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

非常感谢您的帮助!

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,猫就会退出,因此如果您正在生成进程的多个实例,那么您将需要一些其他控制机制,然后可能还有其他更简单的方法来解决它.例如首先在 xterm 中运行整个程序(包括您的 java 程序),但我想由于某种原因这是不可能的,或者您已经尝试过了。

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

touch /tmp/myprogram.log
xterm -e tail -f /tmp/myprogram.log &
runProgram 2>/tmp/myprogram.log

这应该始终有效,但如果 tail 启动太慢,您可能会丢失日志消息(在 tail 中查找标志以在拖尾之前回显整个文件)。将它与陷阱(和“唯一”文件名)结合使用以删除文件,您无需担心清理问题。

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

关于java - 生成终端读取其标准输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3386457/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com