我在java中使用apache.commons.net jar作为我的telnet客户端。我已尝试ESC[{ROW};{COLUMN}H
和ESC[{ROW};{COLUMN}f
进行直接光标寻址,但它没有用,有没有其他方法可以做到这一点,我在这里遗漏了什么?
注意:我正在使用this示例
答案 0 :(得分:0)
在java中,您可以使用文字字符27
。所以,它看起来像这样(可能 - 至少这是我能想到的最佳方式):
class test {
public static void main(String[] args) {
System.out.print((char)27 + "c"); // clear the screen
System.out.print((char)27 + "[H at top");
System.out.flush(); // I would call this just to be safe (esp. if in a loop)
System.out.print((char)27 + "[3;4H row 3; col 4");
System.out.flush(); // I would call this just to be safe (esp. if in a loop)
System.out.println(); // just so that the shell prompt is on the next line
}
}
基本上,(char)27
转换为转义字符(显然是27),但还有另一种方法可以做到这一点。如果您在Unix中并且可以运行vi
或vim
(或emacs
或ed
:D,或者终端中的任何编辑器(我猜),您可以编辑文件,在insert
模式下,您可以按 ctrl v ctrl [。这将显示为^[
但一个字符,转义字符27 。这实质上迫使java将其解释为一个字符,因此它与(char)27
的工作方式相同。
这对于不解释多字节字符的shell(例如sh
)特别有用(我猜)。在sh
中,您可以使用相同的过程来强制执行ansi转义序列(通过执行printf "
ctrl v ctrl [ [3;4H bla";
- 这显示为printf "^[[3;4 bla";
,例如因为printf "\e[3;4 bla";
或printf "\033[3;4 bla";
或{{1}只是在printf "\x1b[3;4 bla";
中工作,因为sh
是一个字符,然后是一个或多个字符。)