在跑数据的时候往往会需要在控制台输出当前进度对数据的传输情况做一个了解。我之前的做法是在一些控制语句中加当前的一个进度,感觉不是很美观。因此,我觉得像以下的方法会更加简洁明了,让程序员更好的掌控全局额,做一个“海王”。
package com.morgan.iron.utils;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import lombok.Data;
/**
* @author Morgan
* @date 2020/1/17 11:21
*/
@Data
public class ProgressBar {
/**
* 进度条长度
*/
private int barLen;
/**
* 用于进度条显示的字符
*/
private char showChar;
/**
*将小数转化为百分比格式
*/
private DecimalFormat formater = new DecimalFormat("0.00%");
/**
* 使用系统标准输出,显示字符进度条及其百分比
*/
public ProgressBar(int barLen, char showChar) {
this.barLen = barLen;
this.showChar = showChar;
}
/**
* 显示进度条
*/
public void show(int value) {
if (value < 0 || value > barLen) {
return;
}
reset();
// 比例
float rate = (float) (value * 1.0 / barLen);
// 比例*进度条总长度=当前长度
draw(barLen, rate);
if (value == barLen) {
afterComplete();
}
}
/**
* 画指定长度个showChar
*/
private void draw(int barLen, float rate) {
int len = (int) (rate * barLen);
System.out.print("<==\t开始传送数据: ");
for (int i = 0; i < len; i++) {
System.out.print(showChar);
}
for (int i = 0; i < barLen - len; i++) {
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);
}
}