Jansi 是一个轻量级 Java 库,让你在 Windows/Linux/macOS 的控制台 / 终端输出彩色文字、背景色、光标控制、清屏等 ANSI 转义码效果,解决了 Windows 控制台原生不支持 ANSI 颜色的问题。
一、核心特性
- 跨平台:Windows CMD/PowerShell、Linux、macOS 全支持
- 零配置:引入依赖即可使用
- 功能丰富:彩色文字、背景、光标移动、清屏、加粗、闪烁等
- 轻量级:无额外依赖
二、工作原理
在大多数 Unix 终端上,Java 通过 System.out 发送 ANSI 转义码时可以正常渲染。但在 Windows 上,这些转义码不会被解释,会显示为乱码。Jansi 解决了这个问题,它会检测并抽象附加终端的 ANSI 支持,根据平台和输出是否附加到真实终端,选择以下方式处理 ANSI 转义码:
- 直接传递
- 过滤掉
- 使用平台特定 API 实现转义序列所代表的终端命令
三、快速开始(Maven/Gradle 引入)
1. Maven 依赖
<dependency>
<groupId>org.fusesource.jansi</groupId>
<artifactId>jansi</artifactId>
<version>2.4.3</version>
<scope>compile</scope>
</dependency>
四、基础使用(3 行代码入门)
Jansi 使用静态常量定义颜色和样式,直接拼接在字符串中即可。
4.1 基本使用流程
import org.fusesource.jansi.Ansi;
import org.fusesource.jansi.AnsiConsole;
public class JansiDemo {
public static void main(String[] args) {
// 1. 初始化:让控制台支持 ANSI 转义码(必须写!Windows 必需要,Linux/macOS 可选)
AnsiConsole.systemInstall();
// 2. 输出彩色文字
System.out.println(Ansi.ansi()
.fgRed() // 红色前景
.a("Hello Jansi! ") // 输出内容
.fgGreen() // 绿色前景
.a("彩色控制台")
.reset()); // 重置样式(避免影响后续输出)
// 3. 卸载(程序结束时执行)
AnsiConsole.systemUninstall();
}
}
4.2 安装和卸载机制
systemInstall() 和 systemUninstall() 方法是成对使用的,它们会跟踪调用次数,只有当 systemUninstall() 的调用次数与 systemInstall() 相匹配时,才会真正卸载。
// 支持嵌套调用 AnsiConsole.systemInstall(); // 计数: 1 AnsiConsole.systemInstall(); // 计数: 2 // ... 使用 Jansi AnsiConsole.systemUninstall(); // 计数: 1 AnsiConsole.systemUninstall(); // 计数: 0,真正卸载
五、完整样式指南(颜色 / 背景 / 样式)
1. 基础颜色(前景 / 背景)
| 前景色(文字色) | 背景色 | 颜色 |
|---|---|---|
| fgBlack() | bgBlack() | 黑色 |
| fgRed() | bgRed() | 红色 |
| fgGreen() | bgGreen() | 绿色 |
| fgYellow() | bgYellow() | 黄色 |
| fgBlue() | bgBlue() | 蓝色 |
| fgMagenta() | bgMagenta() | 品红 |
| fgCyan() | bgCyan() | 青色 |
| fgWhite() | bgWhite() | 白色 |
| fgDefault() | bgDefault() | 默认色 |
2. 高亮色(亮色系)
fgBrightRed() / bgBrightRed(),以此类推(所有颜色都支持 Bright 版本)
3. 文字样式
bold():加粗underline():下划线blink():闪烁(部分终端支持)inverse():反色(前景背景互换)reset():重置所有样式(必须用,防止样式污染)
六、常用功能示例(直接复制运行)
1. 彩色文字 + 背景组合
System.out.println(Ansi.ansi()
.bgBlue() // 蓝色背景
.fgWhite() // 白色文字
.bold() // 加粗
.a(" 蓝底白字加粗 ")
.reset());
2. 多行彩色输出
System.out.println(Ansi.ansi()
.fgRed().a("错误信息")
.fgYellow().a(" 警告信息")
.fgGreen().a(" 成功信息")
.reset());
3. 清屏 + 光标控制
// 清屏
System.out.println(Ansi.ansi().clearScreen());
// 光标移动到 (行, 列)
System.out.println(Ansi.ansi().cursor(5, 10).a("我在坐标(5,10)"));
// 光标上移 2 行
System.out.println(Ansi.ansi().cursorUp(2));
4. 动态进度条(实用场景)
for (int i = 0; i <= 100; i++) {
System.out.print(Ansi.ansi()
.fgCyan()
.a("进度: ")
.fgGreen()
.a(i + "% ")
.cursorToColumn(10) // 光标回到行首
.reset());
Thread.sleep(50);
}
5. 简化写法(推荐)
直接用 Ansi 字符串语法,更简洁:
System.out.println(Ansi.ansi().fg(Ansi.Color.RED).a("红色文字").reset());
七、Windows 系统必看(关键配置)
Windows CMD/PowerShell 默认不支持 ANSI 颜色,必须执行:
AnsiConsole.systemInstall(); // 启用 ANSI 支持
- 程序结束时可以执行
AnsiConsole.systemUninstall(); - IDEA 终端:直接支持,无需额外配置
八、高级用法
1. 自定义 RGB 颜色(24 位真彩色)
// 前景 RGB(255,100,0)
System.out.println(Ansi.ansi().fgRgb(255, 100, 0).a("橙色文字").reset());
2. 封装工具类(项目中直接用)
import org.fusesource.jansi.Ansi;
import org.fusesource.jansi.AnsiConsole;
public class ColorUtil {
// 初始化(程序启动时调用一次)
static {
AnsiConsole.systemInstall();
}
public static String red(String msg) {
return Ansi.ansi().fgRed().a(msg).reset().toString();
}
public static String green(String msg) {
return Ansi.ansi().fgGreen().a(msg).reset().toString();
}
public static String yellow(String msg) {
return Ansi.ansi().fgYellow().a(msg).reset().toString();
}
}
使用:
System.out.println(ColorUtil.red("错误:连接失败"));
System.out.println(ColorUtil.green("成功:操作完成"));
九、常见问题
1. 颜色不生效?
- 忘记写
AnsiConsole.systemInstall(); - Windows 旧版 CMD 建议升级到 Win10+
- IDEA 中开启:
Settings → Editor → Color Scheme → Console Colors → 勾选 ANSI colors
2. 输出乱码?
- 控制台编码设置为 UTF-8
- 不要遗漏
.reset(),避免样式污染