前言
最近在寫一個命令行中的下載工具,既然是下載文件用的,那么實時顯示下載進度是非常有必要的。因此,就有了這里對進度條的實現嘗試。
預覽圖
還是先預覽下效果圖吧。
這里是cmd里面的效果,總體看着還行,不足之處就是可以看到前面的游標在閃爍。
這里是IDEA里面運行的效果圖,由於字符間距都比較大,所以這里看着效果不怎么好。
原理
這里關鍵是用到了這個函數
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++;
}
}
}