Java如何在控制台指定位置打印 实现在已输出内容前插入新语句
Java控制台已打印内容前插入新打印内容实现方案
首先明确结论:该需求可以实现,仅在支持ANSI转义序列的终端环境下生效,Windows 10以下版本的默认CMD、部分IDE内置控制台可能不兼容,Windows Terminal、PowerShell 7+、Linux、macOS原生终端均可以正常支持。
实现原理
Java默认的标准输出是顺序写入的流,已经输出到终端的内容本身无法直接回溯修改,但可以借助ANSI光标控制转义序列,调整光标位置到已打印内容的对应行,清空原有行后按顺序打印新内容、重新打印被覆盖的旧内容,就能模拟出在已打印内容前插入新内容的效果。
具体实现代码
public class InsertPrintDemo { public static void main(String[] args) throws InterruptedException { // 先打印初始内容,后续要在这行前面插入新内容 String oldContent = "this is your manager"; System.out.println(oldContent); // 此处可替换为你的业务逻辑,模拟执行耗时 Thread.sleep(2000); // ANSI转义序列:\033[1A 代表光标向上移动1行,\033[2K代表清空当前整行内容 System.out.print("\033[1A\033[2K"); // 打印需要插入的新内容 System.out.println("Hello there"); // 重新打印被覆盖的原有内容 System.out.println(oldContent); } }
注意事项
- 若需要在N行之前的位置插入内容,将转义序列中的
1A改为NA即可,比如要上移3行就写\033[3A - 如果被覆盖的原有内容有多行,需要提前把所有相关行的内容缓存到内存中,插入新内容后再按顺序重新打印所有旧内容
- 若运行环境完全不支持ANSI转义序列,可以选择先把所有输出内容缓存到内存集合(比如
List<String>)中,需要插入时调整集合内元素的顺序,最后调用系统清屏命令(Windows用cls、类Unix系统用clear)后全量打印集合内的所有内容,也能实现相同效果。
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

