注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

0与1构筑世界,程序员创造时代

软件架构设计 Java编程

 
 
 

日志

 
 

Java实现在控制终端显示的字符进度条  

2013-07-27 15:05:11|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Java实现在控制终端显示的字符进度条 - 傲风 - 宝剑锋从磨砺出 梅花香自苦寒来
 

前言

面向用户使用的程序都会考虑响应性,如:上传、下载文件会显示已经完成百分之多少,方便用户了解处理的进度。在Swing和AWT编写的应用有现成的进度条控件可用,但对于非界面程序就需要自己实现了。
花了点时间写了一个类似于wget的字符进度条,可用于在Linux的命令终端和Windows的命令窗口中实时显示任务处理的进度。

原理:
在每次显示进度条时将光标定位回当前行的最左边,输出当前的进度条覆盖旧的进度条。

特点:

在一行中实时显示进度和百分比,类似于wget的进度条

已知存在的问题:
1、在Eclipse的控制台显示不正常,每次刷新进度条时会换行。
2、当进度条的长度超过控制终端的显示区域时,每次刷新进度条时会换行。

进度条代码

package cn.aofeng.util;

import 
java.text.DecimalFormat;

/**
 * 控制台字符型进度条。
 
 @author 傲风 <aofengblog@163.com>
 */
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[] argsthrows InterruptedException {
        ConsoleProgressBar cpb = new ConsoleProgressBar(010020'=');
        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%


<正文结束>

文章声明


作者:傲风(aofengblog@163.com)       编写时间:2013年07月27日

网址:http://aofengblog.blog.163.com

作者保留所有权利,转载请保留文章全部内容或者说明原作者和转载地址!


  评论这张
 
阅读(4243)| 评论(11)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017