控制台程序并不陌生,这是大多数Java开发者在学习阶段都会使用到的程序类型,也都基于控制台这个运行载体开发过图书管理系统、选苹果还是选香蕉的选择题程序。但是好像从来没有写过类似于Linux系统中带进度条的功能。当在Linux系统中使用命令下载软件的时候,通常会有下载进度条的显示和实时的刷新。如何用Java来实现进度条的加载效果呢?
实现在控制台打印进度条
public class test_01 {
public static void main(String[] args) throws InterruptedException {
int count = 100;
int index = 1;
StringBuffer sb = new StringBuffer("[");
while(index<=count) {
sb.append("=");
System.out.print("\r"+sb+"]"+(index++)+"%");
Thread.sleep(100);
}
}
}
上面的代码实现的原理是通过StringBuffer实现字符串的拼接,然后每次循环输出的时候借助\r让光标移动到当前行的开头,然后打印拼接后的StringBuffer对象的字符串覆盖之前打印过信息,并且每次循环让当前线程睡眠500ms,以此来实现动态打印的效果。
打印效果:
控制台成功的打印了进度条
还可以通过上面的方法实现简单的加载动效
public class test_01 {
public static void main(String[] args) throws InterruptedException {
String[] f = {".","..","..."};
while (true) {
for (String s : f) {
System.out.print("\r" + s);
Thread.sleep(50);
}
}
}
}
通过循环打印符号,从视觉上实现加载动画,实现的效果如下
其实原理还是一样的,本质上都是循环将光标移动到当前行最开始的位置,然后打印数据覆盖掉之前的数据,这样看起来就会是动态的输出效果。
提示
- 控制台的动态加载效果很适合包含下载功能的脚本和其他需要等待时间的小程序,但是需要注意的是,在控制台上进行大量的刷新可能会影响性能。
- 示例中的动态的打印效果依赖不同的终端环境和操作系统,在一些终端环境中,
\r表示回车,这会使示例中的动态加载效果失效,而是变成换行打印的效果。比如示例中的终端环境是IntelliJ IDEA内置的,可以实现动态加载效果,但是相同的代码在Eclipse编辑器的控制台中运行则是换行打印的效果。