首页 > 解决方案 > 如何在JAVA中读取终端给出的光标位置(ANSI设备状态报告)

问题描述

import java.util.Scanner;
import java.util.regex.Pattern;

public class dsr {
    final static String ESC = "\u001b";
    final static String ANSI_PREFIX = ESC + "[";
    final static String ANSI_DSR = ANSI_PREFIX + "6n";
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println("1234567" + ANSI_DSR);
        System.out.println("@" + scan.next(Pattern.compile(".*")));
    }
}

输出

此代码尝试使用扫描仪从终端读取返回,但返回未被捕获并直接显示。扫描仪等待键盘输入。如何检索返回值^[[5;8R

ANSI_escape_code

标签: javaterminal

解决方案


您可以构造一个java.io.FileInputStreamFileDescriptor.in文件描述符读取的 - 这将能够从终端读取输出(这是 System.console().readPassword() 在内部使用的......)

只需使用类似java.io.InputStreamReader实例的东西从文件输入流中读取,直到你得到一个 R 字符(这是光标位置响应的后缀) - 之后你可以使用正则表达式或自己解析它来获取光标位置......

我自己在尝试为 Java 制作 ANSI 图形库时遇到了这个问题,终于弄明白了:)

使用 ANSI 图形在 PowerShell 7.1.3 中显示的 Doom 屏幕截图


推荐阅读