有没有办法从颜色格式化的进程中捕获控制台输出?目前我正在使用
捕获输出BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
但是我找不到如何用颜色捕捉这个文本的方法。彩色文字不以任何特殊字符或任何内容开头。
我将此捕获的文本打印到UI,以便用户查看进程的日志,但很难阅读。所以我想从控制台复制颜色。
这可以在java中完成吗?
我在控制台中使用ProcessBuilder
运行命令。如果我在命令行中运行命令,我会看到彩色文本,但不会在java中。
这个应用程序将在Windows上运行,但如果它甚至可以在linux上运行它会很棒。
答案 0 :(得分:7)
您面临的问题并不完全与Java功能有关。
发生的事情是,许多程序检查stdin是终端还是管道,并以不同的方式生成输出,例如删除颜色格式。有时,通过使用特殊选项来强制生成这些颜色格式1会直接存在解决方法。
如果您使用的二进制文件中没有此选项,那么唯一可行的解决方案是编写自己的伪tty,使目标二进制文件认为它与常规tty对话。
您可以尝试使用此处提供的代码2,也可以看看JetBrains/pty4j,看看是否可以根据需要进行调整。
答案 1 :(得分:1)
@nvidot pty4j提到的方法是:
public static void main(String[] args) throws IOException, InterruptedException
{
try
{
String[] cmd = { "cmd", "/C", "mvn clean" };
String workingDir = "d:\\test";
PtyProcess pty = PtyProcess.exec(cmd, null, workingDir);
InputStream is = pty.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line = null;
while ((line = reader.readLine()) != null)
{
System.out.println(line);
}
int result = pty.waitFor();
}
catch (Exception e)
{
e.printStackTrace();
e.getCause().printStackTrace();
}
}
这给了我以下输出:
(显然,需要对其进行一点清理,但是其中的颜色代码清晰可见并可以进行解析,例如:“ 94m”,“ 92m”,“ 36m”等)
[0m[0K[[0;34;94mINFO[0m] Scanning for projects...[0K[?25l
[0K[?25h[[0;34;94mINFO[0m][0K[?25l
[[0;34;94mINFO[0m] [0;1m-----------------------------< [0;36mtest:test[0;1m >------------------------------[0m[0K
[[0;34;94mINFO[0m] [0;1mBuilding test 1.0-SNAPSHOT[0m[0K
[[0;34;94mINFO[0m] [0;1m----------[0m[0K[15G[?25h[?25l
[[0;34;94mINFO[0m] [0;1m--------------------------------[ jar ]---------------------------------[0m[0K
[0K[?25h[[0;34;94mINFO[0m][0K[?25l
[[0;34;94mINFO[0m] [0;1m--- [0;32mmaven-clean-plugin:3.1.0:clean[0m [0;1m(default-clean)[0m @ [0;36mtest[0;1m ---[0m[0K
[0K[?25h[[0;34;94mINFO[0m] [0;1m------------------------------------------------------------------------[0m[0K[?25l
[[0;34;94mINFO[0m] [0;32;92mBUILD SUCCESS[0m[0K
[[0;34;94mINFO[0m] [0;1m--------------[0m[0K[16G[?25h[?25l
[[0;34;94mINFO[0m] [0;1m------------------------------------------------------------------------[0m[0K
[[0;34;94mINFO[0m] Total time: 1.924 s[0K
[[0;34;94mINFO[0m] Finished at: 2020-10-19T12:36:46-07:00[0K
[[0;34;94mINFO[0m] [0;1m------------------------------[0m[0K[32G[?25h[?25l
[[0;34;94mINFO[0m] [0;1m------------------------------------------------------------------------[0m[0K
[0K[?25h