为什么想着去用Java去实现命令行实现进度条呢,在上Python课时,课本上有实现文本进度条的例子,老师也执行了该列子的效果,突然想到了linux,dos命令行中下载文件时的文本进度条,所以想着用java实现个进度条玩玩。
这里科普到一个知识点:System.out.print("\b"); // 将标准输出光标索引后移即字符退位。
System.out.print("Hello"); // 标准输出后控制台 H e l l o_
光标在o之后,若我们将光标索引后退两位,System.out.print("\b\b");//光标移动到l之下 H e l l o
若我们输出System.out.print("L")//输出一个大写的L后,小写的l 将被大小的L替代,光标索引进一位在o上 即 H e l L o
在实验完后可以感觉到打开命令行窗口时闪烁的光标,在输入一个字符后光标前进一位。但该光标为输入光标,后退一位输入字符是光标向前增加字符。与标准输出流光标退位不同。
最后是实现的代码:
public class Test {
public static void main(String[] args) {
new Test().printProgress();
}
// 将光标后移 num 位
public void printToPre(int num){
for(int i = 0; i < num; i++){
System.out.print("\b");
}
}
// 在光标位开始 即索引在第一个 - 时 开始输出num个 >
void printEnd(int num){
for(int i = 0; i < num; i++ ){
System.out.print(">");
}
}
void printProgress(){
String progress = "Progress:___%[----------]";
System.out.print(progress);
int i = 0;
int j = 0; // 10个光标每当 10%倍数时 设置输出的>的个数
printToPre(11); //直接将光标移动到[
while( i < 101) {
if(i < 10){
printToPre(3); //后移3位在输出i+%[ 实现更新百分比
System.out.print(i+"%["); //光标索引到第一个 -
printEnd(j); //输出j个>后光标索引到第j个-
printToPre(j); // 要将光标移到到[索引位,即后退j位
}
else if(i >= 10 && i <= 99){
printToPre(4); //当i输出的字符位为2位时多后退一位
System.out.print(i+"%[");
printEnd(j);
printToPre(j);
}
else{
printToPre(5); //i三位,再多退一位
System.out.print(i+"%[");
printEnd(j);
printToPre(j);
}
i++;
if(i%10 == 0){ //当百分百达到10的倍数时,增加要输出>字符的个数
j++;
}
try {
Thread.currentThread().sleep(50); //睡眠50ms,更好看进度效果
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
效果: