我正在使用BufferedReader从终端读取行:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String cmd;
String displayTime;
while(true)
{
System.out.print(displayTime + "> ");
cmd = in.readLine();
// Process cmd
}
目标是使Shell前缀显示时间一直到某个东西到期为止。我有一个单独的线程,通过执行(诠释其run()方法)来每秒更新字符串displayTime
,例如“ 5:00”,“ 4:49”……。
while(true)
{
Thread.sleep(1000);
decrement(displayTime);
System.out.print("\r" + displayTime + "> ");
}
回车符“ \ r” ar达到了打印语句的开头,但是当用户键入时,当回车符中断它们时,它们的光标将重置为开头,并且他们将开始替换字符他们之前已经输入过(尽管BufferedReader仍然包含正确的命令,但从视觉上看这是错误的)。
例如,键入“ listfiles”的结果:
l
li
lis
list
fist <-- carriage return happens here
fist
filt
file
files
有没有一种方法可以编辑外壳程序前缀,然后返回到用户之前键入的光标位置,以便他们可以无缝恢复?
答案 0 :(得分:1)
假定输入来自常规输入(例如,无诅咒,readline等),则以下转义序列可用于VT100兼容终端(包括大多数xterm,vt102和其他终端仿真器)。 ESC是转义符(\033
)
ESC 7
println应该类似于:
System.out.print("\0337\r" + displayTime + "> \0338");
您还必须确保未缓冲System.out。