Java實現在控制終端顯示的字元進度條

壹頁書發表於2014-05-16
今天看到一個很有意思的小程式,記錄一下


  1. import java.text.DecimalFormat;

  2. /**
  3.  * 控制檯字元型進度條。
  4.  *
  5.  * @author 傲風 <aofengblog@163.com>
  6.  */
  7. public class ConsoleProgressBar {

  8.     private long minimum = 0; // 進度條起始值
  9.     
  10.     private long maximum = 100; // 進度條最大值
  11.     
  12.     private long barLen = 100; // 進度條長度
  13.     
  14.     private char showChar = '='; // 用於進度條顯示的字元
  15.     
  16.     private DecimalFormat formater = new DecimalFormat("#.##%");
  17.     
  18.     /**
  19.      * 使用系統標準輸出,顯示字元進度條及其百分比。
  20.      */
  21.     public ConsoleProgressBar() {
  22.     }
  23.     
  24.     /**
  25.      * 使用系統標準輸出,顯示字元進度條及其百分比。
  26.      *
  27.      * @param minimum 進度條起始值
  28.      * @param maximum 進度條最大值
  29.      * @param barLen 進度條長度
  30.      */
  31.     public ConsoleProgressBar(long minimum, long maximum,
  32.             long barLen) {
  33.         this(minimum, maximum, barLen, '=');
  34.     }
  35.     
  36.     /**
  37.      * 使用系統標準輸出,顯示字元進度條及其百分比。
  38.      *
  39.      * @param minimum 進度條起始值
  40.      * @param maximum 進度條最大值
  41.      * @param barLen 進度條長度
  42.      * @param showChar 用於進度條顯示的字元
  43.      */
  44.     public ConsoleProgressBar(long minimum, long maximum,
  45.             long barLen, char showChar) {
  46.         this.minimum = minimum;
  47.         this.maximum = maximum;
  48.         this.barLen = barLen;
  49.         this.showChar = showChar;
  50.     }
  51.     
  52.     /**
  53.      * 顯示進度條。
  54.      *
  55.      * @param value 當前進度。進度必須大於或等於起始點且小於等於結束點(start <= current <= end)。
  56.      */
  57.     public void show(long value) {
  58.         if (value < minimum || value > maximum) {
  59.             return;
  60.         }
  61.         
  62.         reset();
  63.         minimum = value;
  64.         float rate = (float) (minimum*1.0 / maximum);
  65.         long len = (long) (rate * barLen);
  66.         draw(len, rate);
  67.         if (minimum == maximum) {
  68.             afterComplete();
  69.         }
  70.     }

  71.     private void draw(long len, float rate) {
  72.         for (int i = 0; i < len; i++) {
  73.             System.out.print(showChar);
  74.         }
  75.         System.out.print(' ');
  76.         System.out.print(format(rate));
  77.     }
  78.     
  79.     private void reset() {
  80.         System.out.print('\r');
  81.     }
  82.     
  83.     private void afterComplete() {
  84.         System.out.print('\n');
  85.     }
  86.     
  87.     private String format(float num) {
  88.         return formater.format(num);
  89.     }
  90.     
  91.     public static void main(String[] args) throws InterruptedException {
  92.         ConsoleProgressBar cpb = new ConsoleProgressBar(0, 100, 20, '=');
  93.         for (int i = 1; i <= 100; i++) {
  94.             cpb.show(i);
  95.             Thread.sleep(100);
  96.         }
  97.     }

  98. }
轉自:
http://aofengblog.blog.163.com/blog/static/6317021201362723025426/

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1162488/,如需轉載,請註明出處,否則將追究法律責任。

相關文章