原理简述
对于通常的命令行输出,大部分人的印象都是一行一行递增的模式。而进度条需要每次内容更新都在同一行,容易让人觉得很“神奇”。一些问答网站上,如 StackOverflow,就有人问“某某语言如何实现命令行进度条”。
其实命令行进度条与具体编程语言无关,它只是巧用了回车符。(回车符在很多编程语言中是“\r”)即,在更新进度条时并不会另起一行,而是对进度条整行内容进行覆写,而且新的内容以回车符打头,并且末尾没有换行符。(换行符在很多编程语言中是“\n”)
Java版实现示例
命令行进度条的实现原理虽然简单,但是具体实现可以变化万千。在具体项目中可以根据需求自行设计。
此示例中,有两个主要的类:
- ProgressBar:负责更新进度条内容
- Worker:模拟执行耗时的工作,并触发进度更新
界面示例
Worker
class Worker { private ProgressBar progressBar; private int workload; Worker(int workload, ProgressBar progressBar) { this.workload = workload; this.progressBar = progressBar; } void start() { System.out.print("Working..."); int progress = 0; while (progress < workload) { // 用sleep模拟一个耗时的操作 try { Thread.sleep(100); } catch (InterruptedException ignore) { } // 更新进度:每次进度加1 progress++; progressBar.onProgressChanged(progress); } System.out.print("Worker finish."); } }
ProgressBar
class ProgressBar { private boolean inited = true; private boolean done = false; // 共10个进度分块 private int blockCount = 10; // 用等号表示已完成的进度块 private char finishedBlockChar = '='; // 用空格表示未完成的进度块 private char unfinishedBlockChar = ' '; // 最大进度值 private int max; ProgressBar(int max) { this.max = max; } // 更新进度 void onProgressChanged(int progress) { // 工作完成后不执行任何进度信息更新 if (done) { return; } // 初次出输进度时需要另起一行,避免覆盖之前输出的其它内容 if (inited) { System.out.print("\n"); } if (progress >= max) { progress = max; done = true; } System.out.print(createProgressContent(progress)); inited = false; // 工作完成后需换行,以避免后续其它内容出现在进度条所在行 if (done) { System.out.print("\n"); } } private String createProgressContent(int progress) { StringBuilder sb = new StringBuilder("\rProgress: ["); int finishedBlockCount = progress * blockCount / max; int unfinishedBlockCount = blockCount - finishedBlockCount; for (int i = 0; i < finishedBlockCount; i++) { sb.append(finishedBlockChar); } for (int i = 0; i < unfinishedBlockCount; i++) { sb.append(unfinishedBlockChar); } sb.append("] "); sb.append(progress); sb.append("/"); sb.append(max); return sb.toString(); } }
使用示例
public static void main(String[] args) { // 限定最大进度值为100 int max = 100; ProgressBar progressBar = new ProgressBar(max); // 由工作线程主动发起进度条更新 Worker worker = new Worker(max, progressBar); worker.start(); }
相关推荐
基于java的开发源码-命令行进度条 JCmdLineProgess.zip 基于java的开发源码-命令行进度条 JCmdLineProgess.zip 基于java的开发源码-命令行进度条 JCmdLineProgess.zip 基于java的开发源码-命令行进度条 ...
Java的命令行进度条 JCmdLineProgess
Java的命令行进度条 JCmdLineProgess.7z
主要介绍了用C++实现一个命令行进度条的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
基于Java的的命令行进度条 JCmdLineProgess.zip
基于java的的命令行进度条 JCmdLineProgess.zip
基于Java的实例源码-命令行进度条 JCmdLineProgess.zip
java源码:Java的命令行进度条 JCmdLineProgess.zip
这是这是 golang 的命令行进度条。用法 // show progress bar as 78.9%Show ( 0.789 )截屏
此为Android ProgressBar 简单进度条的实现及示例下载源码,基本思路是:将模拟任务分成大小为100个的数组,任务完成度--默认为0,状态完成度默认也为0,然后构造一个线程用于显示消息,然后定义dowork()函数,完成...
`progress('_start')` 初始化一个新的进度条。 必须始终先调用。 `progress(i)` 更新进度条。 `i` 是一个百分比。 `progress(i, m)` 类似,但会自动计算百分比,其中 `i` 是当前步骤,`m` 是最大步骤数。 `...
该文件提供了与等待栏等效的文本,它无需 GUI 即可工作,且命令行中不会出现许多“printf”。 使用示例: pb = CmdLineProgressBar('做事...'); 对于 k = 1 : 10 pb.print(k,10) % 做东西结尾
主要介绍了Python调用命令行进度条的方法,涉及Python进度条的调用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
进度条的简单实现,需要在cmd中才能展示效果,控制台看不到效果,具体的业务逻辑可根据需求修改
免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,...
Java的命令行进度条 JCmdLineProgess类库
asp.net 带有进度条的文件上传示例
js+HTML5 canvas 实现简单的加载条(进度条)功能示例.docx