[Thinking in Java]
阿新 • • 發佈:2018-12-26
java實現控制檯的進度條,其實就是將之前每一行列印的進度條,反覆的列印在同一行上,實現視覺上的進度條增長的效果。
package com.ccd.ym.util;
import java.text.DecimalFormat;
public class ConsoleProgressBar {
private long minimum = 0; // 進度條起始值
private long maximum = 100; // 進度條最大值
private long barLen = 100; // 進度條長度
private char showChar = '=' ; // 用於進度條顯示的字元
private DecimalFormat formater = new DecimalFormat("#.##%");
/**
* 使用系統標準輸出,顯示字元進度條及其百分比。
*/
public ConsoleProgressBar() {
}
/**
* 使用系統標準輸出,顯示字元進度條及其百分比。
*
* @param minimum 進度條起始值
* @param maximum 進度條最大值
* @param barLen 進度條長度
*/
public ConsoleProgressBar(long minimum, long maximum,
long barLen) {
this(minimum, maximum, barLen, '=');
}
/**
* 使用系統標準輸出,顯示字元進度條及其百分比。
*
* @param minimum 進度條起始值
* @param maximum 進度條最大值
* @param barLen 進度條長度
* @param showChar 用於進度條顯示的字元
*/
public ConsoleProgressBar(long minimum, long maximum,
long barLen, char showChar) {
this.minimum = minimum;
this.maximum = maximum;
this.barLen = barLen;
this.showChar = showChar;
}
/**
* 顯示進度條。
*
* @param value 當前進度。進度必須大於或等於起始點且小於等於結束點(start <= current <= end)。
*/
public void show(long value) {
if (value < minimum || value > maximum) {
return;
}
reset();
minimum = value;
float rate = (float) (minimum*1.0 / maximum);
long len = (long) (rate * barLen);
draw(len, rate);
if (minimum == maximum) {
afterComplete();
}
}
private void draw(long len, float rate) {
System.out.print("Progress: ");
for (int i = 0; i < len; i++) {
System.out.print(showChar);
}
System.out.print(' ');
System.out.print(format(rate));
}
private void reset() {
System.out.print('\r'); //游標移動到行首
}
private void afterComplete() {
System.out.print('\n');
}
private String format(float num) {
return formater.format(num);
}
// public static void main(String[] args) throws InterruptedException {
// ConsoleProgressBar cpb = new ConsoleProgressBar(0, 100, 30, '#');
// for (int i = 1; i <= 100; i++) {
// cpb.show(i);
// Thread.sleep(100);
// }
// }
}
程式碼很簡單,但是存在的問題是,遇到程式列印的log會換行,效果如下: