【问题标题】:\b not clearing last character in a specific instance\b 不清除特定实例中的最后一个字符
【发布时间】:2016-06-29 18:10:20
【问题描述】:
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 的最后一个“-”:其中两个破折号打印“--”,但如果我在其他情况下包含一个空格(即将“/”和“\\”更改为“/”和“\\”)然后它正在正确清除整行。有人可以帮我指出为什么它的行为如此奇怪吗?

【问题讨论】:

    标签: java multithreading command-prompt unicode-escapes


    【解决方案1】:

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

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

    所以当你打印时:

    System.out.println("Hello\b");
    

    什么都没有发生。因为没有后续人物。另一方面,当您打印时:

    System.out.println("Hello\b ");
    

    然后它删除“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 个退格键。

    无论如何,您的程序根本没有在新线程中运行。您还应该学习多线程,以了解如何正确启动和使用线程。

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

    【讨论】:

    • 谢谢,帮了大忙。还要感谢您指出线程 start() 问题,我是多线程的新手。如果您能推荐一些好的、详细的线程在线材料,那将会很有用。
    • 嗯,这是一个难题。我一直在努力寻找一个好的资源来学习在线线程。当然,您应该先学习 Oracle 线程教程,这样您就会了解基本概念。 docs.oracle.com/javase/tutorial/essential/concurrency 但我建议拿起这本书:Brian Goetz 写的“Java concurrency in practice”。这是一本很好的书,里面有很多例子和反例(你应该做什么和不应该做什么),它以一种非常易于阅读的方式解释了基本概念。
    • 好的,船长,感谢您提供这些出色的建议,如果我的在线资源请求占用了您的时间,我深表歉意。再次感谢您的帮助,您做得很好。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多