woff 發表於 2014-8-13 17:52:15

Java實現在linux終端顯示的字符進度條



前言
面向用戶使用的程序都會考慮響應性,如:上傳、下載文件會顯示已經完成百分之多少,方便用戶瞭解處理的進度。在Swing和AWT編寫的應用有現成的進度條控件可用,但對於非界面程序就需要自己實現了。
花了點時間寫了一個類似於wget的字符進度條,可用於在Linux的命令終端和Windows的命令窗口中實時顯示任務處理的進度。

原理:
在每次顯示進度條時將光標定位回當前行的最左邊,輸出當前的進度條覆蓋舊的進度條。

特點:
在一行中實時顯示進度和百分比,類似於wget的進度條

已知存在的問題:
1、在Eclipse的控制台顯示不正常,每次刷新進度條時會換行。
2、當進度條的長度超過控制終端的顯示區域時,每次刷新進度條時會換行。

進度條代碼package cn.aofeng.util;
import java.text.DecimalFormat;
/**
* 控制台字符型進度條。
*
* @author 傲風 <<a href="mailto:aofengblog@163.com" target="_blank">aofengblog@163.com</a>>
*/
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) {
      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, 20, '=');
      for (int i = 1; i <= 100; i++) {
            cpb.show(i);
            Thread.sleep(100);
      }
    }

} 效果
java -cp ./classes cn.aofeng.util.ConsoleProgressBar
完成百分之30時顯示:======= 30%
完成百分之50時顯示:========== 50%
完成百分之100時顯示:==================== 100%


<正文結束>



頁: [1]
查看完整版本: Java實現在linux終端顯示的字符進度條