不清除特定实例中的最后一个字符


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中的最后一个"-",其中两个破折号打印为"——",但如果我在其他情况下(即:将"/"one_answers"\"更改为"/"one_answers"\"),然后正确地清除整行。有人能帮我指出为什么它的行为如此奇怪吗?

嗯。这是一个有趣的问题。您遇到的问题是退格字符就是这样。一个角色。如何处理这个字符取决于打印它的终端。

所以在我的情况下,我使用的是OS X终端,这个程序只是使用退格字符并将光标向后移动一个槽。然后,如果有后续字符,则删除这些字符。

所以当你输出:

System.out.println("Hellob");

什么也不会发生。因为没有后续字符。另一方面,当你打印:

System.out.println("Hellob ");

然后删除"o"字符,因为后面有一个字符(一个空格)。我知道这很奇怪,但这就是事实。

现在在你的程序中,你基本上打印50个退格字符到输出流中,然后你打印你的消息。然后再退格50。然后是另一条信息。然后再退格50。然后是第三条信息,依此类推。

留言的长度为:

* 1 N

* 2 N + 1

* 3 N

在第二种情况下,你的消息长度比另一个长一个字符,所以即使你打印N+1个字符,只有N个退格字符将被激活,因为退格字符将查看你的上一条消息而不是后续消息。

把这两件事放在一起(看看你的代码后面,终端移动光标但不删除它),你会体验到你所经历的。

一个解决方案是,您只需在cls函数的开头添加一个空格,如下所示:

// 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个退格。

无论如何,你的程序根本没有在一个新线程中运行。你也应该学习多线程,学习如何正确地启动和使用线程。

对于starter,当您扩展Thread类时,您应该运行start()方法来激活它。否则你的代码只是在主线程上运行。

相关内容

  • 没有找到相关文章

最新更新