1. 程式人生 > >[Thinking in Java]

[Thinking in Java]

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會換行,效果如下:
這裡寫圖片描述