1

我正在编写一个使用 ANSI 颜色代码打印日志消息的 Java 框架。当然,用户总是有可能在 Eclipse 中使用它,在这种情况下,ANSI 转义码在控制台上显示为垃圾字符。自动检测它会很好,这样用户就不必手动关闭它。

我已经对这个主题进行了一些谷歌搜索,我怀疑它无法完成,但没有多少人尝试过,所以我认为值得一问。想到的一种方法是检查是否"xterm".equals(System.getenv("TERM")),哪种方法有效,但有很多例外,并且在 Windows 上根本不起作用(我也在使用 JANSI 库来获得 Windows 彩色终端支持)。想到的另一个选择是尝试调用外部程序来检查被调用的进程是否eclipse正在运行,但这是一个肮脏的黑客攻击,并且也有边缘情况(如果有人在终端中运行程序同时使用蚀)。

我什至尝试使用反射来查找正在包装的OutputStream子类System.out,假设它可能会根据终端类型而有所不同,但这显然是FileOutputStream无论如何。

有没有更简单的方法来确定 Java 程序是否在内置的 Eclipse 控制台中运行,或者这是否像听起来那样无望?

4

3 回答 3

0

当然,用户总是有可能在 Eclipse 中使用它,在这种情况下,ANSI 转义码在控制台上显示为垃圾字符。

实际上,它比这更复杂。

stdout “不是 Eclipse”这一事实并不能保证它能够理解 ANSI 终端代码。输出可以重定向到文件,或者您可能正在与不支持 ANSI 的远程控制台(甚至是物理终端/打印机)交谈。

我认为您最好的选择是使用 TERM 环境变量进行“最佳猜测”,并使用命令行选项(或首选项)来覆盖它。或者根本不用为控制台输出着色。


另一种可能性可能是:http ://code.google.com/p/jlibs/wiki/AnsiColoring ...但我怀疑它在广泛的操作系统平台上运行得不够好。

于 2013-08-12T04:45:37.473 回答
0

我不确定您是否可以检测是否在 Eclipse 中运行,但您可以检测它是否作为 jar 运行。(Eclipse 将文件夹加载为类路径,而不是 jar 文件)只需比较 ClassName.class.getResource 与 ClassName.class.getResourceAsStream。getResourceAsStream 在 jar 或其他环境中工作,而 getResource 在 jar 中不起作用(我认为)。

于 2013-08-12T03:31:07.740 回答
0

你将不得不做一些猜测工作。

  1. 检查 TERM 环境变量
  2. 检查 SHELL 环境变量
  3. 检查父 PID 指向的内容
于 2015-08-21T11:55:51.353 回答