Java捕获过程输出颜色

时间:2017-08-21 04:29:20

标签: java cmd

有没有办法从颜色格式化的进程中捕获控制台输出?目前我正在使用

捕获输出
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));

但是我找不到如何用颜色捕捉这个文本的方法。彩色文字不以任何特殊字符或任何内容开头。

我将此捕获的文本打印到UI,以便用户查看进程的日志,但很难阅读。所以我想从控制台复制颜色。

这可以在java中完成吗? 我在控制台中使用ProcessBuilder运行命令。如果我在命令行中运行命令,我会看到彩色文本,但不会在java中。

这个应用程序将在Windows上运行,但如果它甚至可以在linux上运行它会很棒。

2 个答案:

答案 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