\b 不清除特定实例中的最后一个字符
\b not clearing last character in a specific instance
class progReport extends Thread {
// function for clearing the line by printing escape char '\b'
private static void cls(){
for (int i = 0; i <50; i++) {
System.out.print("\b");
}
} //End of cls
//Running a thread for printing the message every 100 ms.
public void run(int prog) {
int k;
cls();
try {
Thread.sleep(100);
} catch(InterruptedException e) {
e.printStackTrace();
}
System.out.print("Scanning: " + (prog) + "% ");
k=prog%3; // mod 3, so as to decide which symbol to be used for revolving animation
switch (k) {
case 0:
System.out.print("/");
break;
case 1:
System.out.print("--"); // LINE WITH THE PROBLEM
break;
default:
System.out.print("\");
break;
} // End of switch
} // End of run
} // end of class progReport
// class with main
public class ProgressDemo {
public static void main(String...a) {
int prog = 0;
progReport pr = new progReport();
while(prog <= 100)
pr.run(prog++);
System.out.println("\nScanning Complete!!");
} // End of main
} // End of class ProgressDemo
在命令行上执行此代码后,它不会清除案例 1 的最后一个“-”:其中两个破折号打印为“--”,但如果我包含一个 space 在其他情况下(即将“/”和“\\”更改为“/”和“\\”)然后它会正确清除整行。谁能帮我指出为什么它表现得如此奇怪?
嗯。这是一个有趣的问题。您遇到的问题是 backspace 字符就是这样。一个人物。如何处理这个字符取决于打印它的终端。
所以在我的例子中,我使用的是 OS X 终端,这个程序只是简单地使用 backspace 字符并将光标向后移动一个槽位。然后,如果有后续字符,则删除这些字符。
所以当你打印时:
System.out.println("Hello\b");
没有任何反应。因为没有后续角色。另一方面,当您打印时:
System.out.println("Hello\b ");
然后删除 "o" 字符,因为有一个后续字符(空 space)。我知道这很奇怪,但事实就是如此。
现在在您的程序中,您基本上将 50 个 space 字符打印到输出流中,然后打印您的消息。然后 50 backspace 再一次。然后是另一条消息。然后 50 backspace 再一次。然后是你的第三条消息等等。
您的消息长度为:
*1 N
*2N+1
*3N
在第二种情况下,您的消息长度比另一个长一个字符,因此即使您打印 N+1 个字符,也只有 N 个 backspace 个字符是活动的,因为 backspace 个字符将查看您的最后一条消息,而不是后续消息。
把这两件事放在一起(看看你的代码后面,终端移动光标但不删除它)你会体验到你所体验到的。
一个解决方案是您只需在 cls
函数的开头附加一个空的 space,如下所示:
// function for clearing the line by printing escape char '\b'
private static void cls(){
System.out.print(" ");
for (int i = 0; i < 50; i++) {
System.out.print("\b");
}
} //End of cls
这将确保即使您的消息只有 N 长,它也会激活 N+1 回 spaces。
无论如何,您的程序根本没有 运行在新线程中。你也应该学习多线程,学习如何正确启动和使用线程。
对于初学者,当您扩展线程 class 时,您应该 运行 start()
方法来激活它。否则你的代码只是 运行ning 在主线程上。
class progReport extends Thread {
// function for clearing the line by printing escape char '\b'
private static void cls(){
for (int i = 0; i <50; i++) {
System.out.print("\b");
}
} //End of cls
//Running a thread for printing the message every 100 ms.
public void run(int prog) {
int k;
cls();
try {
Thread.sleep(100);
} catch(InterruptedException e) {
e.printStackTrace();
}
System.out.print("Scanning: " + (prog) + "% ");
k=prog%3; // mod 3, so as to decide which symbol to be used for revolving animation
switch (k) {
case 0:
System.out.print("/");
break;
case 1:
System.out.print("--"); // LINE WITH THE PROBLEM
break;
default:
System.out.print("\");
break;
} // End of switch
} // End of run
} // end of class progReport
// class with main
public class ProgressDemo {
public static void main(String...a) {
int prog = 0;
progReport pr = new progReport();
while(prog <= 100)
pr.run(prog++);
System.out.println("\nScanning Complete!!");
} // End of main
} // End of class ProgressDemo
在命令行上执行此代码后,它不会清除案例 1 的最后一个“-”:其中两个破折号打印为“--”,但如果我包含一个 space 在其他情况下(即将“/”和“\\”更改为“/”和“\\”)然后它会正确清除整行。谁能帮我指出为什么它表现得如此奇怪?
嗯。这是一个有趣的问题。您遇到的问题是 backspace 字符就是这样。一个人物。如何处理这个字符取决于打印它的终端。
所以在我的例子中,我使用的是 OS X 终端,这个程序只是简单地使用 backspace 字符并将光标向后移动一个槽位。然后,如果有后续字符,则删除这些字符。
所以当你打印时:
System.out.println("Hello\b");
没有任何反应。因为没有后续角色。另一方面,当您打印时:
System.out.println("Hello\b ");
然后删除 "o" 字符,因为有一个后续字符(空 space)。我知道这很奇怪,但事实就是如此。
现在在您的程序中,您基本上将 50 个 space 字符打印到输出流中,然后打印您的消息。然后 50 backspace 再一次。然后是另一条消息。然后 50 backspace 再一次。然后是你的第三条消息等等。
您的消息长度为:
*1 N
*2N+1
*3N
在第二种情况下,您的消息长度比另一个长一个字符,因此即使您打印 N+1 个字符,也只有 N 个 backspace 个字符是活动的,因为 backspace 个字符将查看您的最后一条消息,而不是后续消息。
把这两件事放在一起(看看你的代码后面,终端移动光标但不删除它)你会体验到你所体验到的。
一个解决方案是您只需在 cls
函数的开头附加一个空的 space,如下所示:
// function for clearing the line by printing escape char '\b'
private static void cls(){
System.out.print(" ");
for (int i = 0; i < 50; i++) {
System.out.print("\b");
}
} //End of cls
这将确保即使您的消息只有 N 长,它也会激活 N+1 回 spaces。
无论如何,您的程序根本没有 运行在新线程中。你也应该学习多线程,学习如何正确启动和使用线程。
对于初学者,当您扩展线程 class 时,您应该 运行 start()
方法来激活它。否则你的代码只是 运行ning 在主线程上。