Java實現命令行中的進度條功能


前言

最近在寫一個命令行中的下載工具,既然是下載文件用的,那么實時顯示下載進度是非常有必要的。因此,就有了這里對進度條的實現嘗試。

預覽圖

還是先預覽下效果圖吧。
這里是cmd里面的效果,總體看着還行,不足之處就是可以看到前面的游標在閃爍。

Gif

這里是IDEA里面運行的效果圖,由於字符間距都比較大,所以這里看着效果不怎么好。

Gif

原理

這里關鍵是用到了這個函數

System.out.print("\b");

其中轉義符\b的作用就是刪除游標前面的一個字符。

這里舉個栗子:

System.out.print("hello,world!");
System.out.print("\b\b");

執行完第一行后是輸出了

hello,world!

注意這里都用的都是print函數,而不是println函數。
執行到第二行后,輸出就變為了

hello,worl

因為有兩個\b,所以刪除兩個字符,因此刪掉了d和!,還剩下hello,worl
原理懂了之后,剩下的效果實現應該是非常簡單了。下面直接上代碼吧。

代碼

Talk is cheap,show me the code! ------ 屁話少說,放碼過來!


public class ProgressBar {

    private int index = 0;
    private String finish;
    private String unFinish;


    // 進度條粒度
    private final int PROGRESS_SIZE = 50;
    private int BITE = 2;

    private String getNChar(int num, char ch){
        StringBuilder builder = new StringBuilder();
        for(int i = 0; i < num; i++){
            builder.append(ch);
        }
        return builder.toString();
    }

    public void printProgress() throws InterruptedException {
        System.out.print("Progress:");

        finish = getNChar(index / BITE, '█');
        unFinish = getNChar(PROGRESS_SIZE - index / BITE, '─');
        String target = String.format("%3d%%[%s%s]", index, finish, unFinish);
        System.out.print(target);

        while (index <= 100){
            finish = getNChar(index / BITE, '█');
            unFinish = getNChar(PROGRESS_SIZE - index / BITE, '─');

            target = String.format("%3d%%├%s%s┤", index, finish, unFinish);
            System.out.print(getNChar(PROGRESS_SIZE + 6, '\b'));
            System.out.print(target);

            Thread.sleep(50);
            index++;
        }
    }
}



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM