`

命令行进度条的实现原理和示例

    博客分类:
  • Tip
 
阅读更多

原理简述

对于通常的命令行输出,大部分人的印象都是一行一行递增的模式。而进度条需要每次内容更新都在同一行,容易让人觉得很“神奇”。一些问答网站上,如 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();
}
  • 大小: 27.2 KB
  • 大小: 1.6 KB
分享到:
评论

相关推荐

    详解Python实现进度条的4种方式

    这种方法的基本原理是利用转义字符来控制输出的颜色和格式,并且通过`\r`实现光标回到行首而不换行,以及通过`flush=True`参数强制刷新输出内容以实时更新进度显示。示例代码中演示了如何打印一个简单的进度条,并在...

    DirectShow播放视频文件的命令行简单实现

    你可以通过编译和运行该项目,查看其具体实现细节,包括如何加载滤镜,如何处理命令行参数,以及如何管理DirectShow接口和方法。 为了提高播放器的功能,你还可以添加额外的特性,如音视频同步、播放控制(暂停、...

    python进度条代码实例.zip

    `loading.py`可能是一个基于控制台(命令行)的进度条实现。在Python中,可以使用第三方库如`tqdm`或者自定义逻辑来创建这样的功能。通常,进度条会通过循环更新一个百分比,每次迭代都会打印出新的进度状态,这样...

    Console进度条

    控制台进度条的设计和实现可以基于各种编程语言,如Python、C++、Java等,它们利用控制台输出和刷新的特性来创建动态效果。 在Python中,可以使用`sys.stdout.write()`和`sys.stdout.flush()`来更新屏幕内容,同时...

    进度条

    在描述中提到的博客链接指向了ITEYE上的一篇博文,尽管没有提供具体的摘要,我们可以推测这篇博文可能深入探讨了进度条的实现原理,可能包括如何在代码中创建和更新进度条,以及如何将其与各种任务的执行状态关联...

    控制台上输出显示进度条

    在控制台应用程序中,进度条是一种非常实用的用户界面元素...通过理解和掌握这些基本原理,你可以根据实际需求创建出适应各种情况的进度条。无论是简单的进度更新还是复杂的动画效果,都可以通过巧妙的编程技巧来实现。

    Python-bunny一个类似于tqdm的进度条但拥有更多的兔子

    通过查看源代码,我们可以深入理解其内部工作原理,学习如何实现自定义进度条。此外,示例代码可以帮助我们快速上手使用这个库,而文档则提供了详细的使用指南和API参考。 总的来说,`Python-bunny`为Python开发者...

    Python-一个简单的python进度条工具来帮助显示你的工作进度

    首先,我们要知道在Python中实现进度条的原理通常是基于迭代器或循环的。通过计算已完成任务的比例,我们可以更新进度条的状态。这个比例通常被转换为百分比,然后用于更新进度条的长度。 进度条工具有很多现成的库...

    Linux下模拟实现进度条实例详解

    ### Linux下模拟实现进度条实例详解 #### 一、引言 在开发过程中,为了提高用户体验,进度条是一项非常实用的功能。特别是在Linux环境下,我们经常...希望本文能帮助大家更好地理解和应用进度条的实现原理和技术细节。

    python实现文本进度条 程序进度条 加载进度条 单行刷新功能

    以下是一段 Python 代码示例,该示例演示了如何实现文本进度条以及如何使用单行刷新功能: ```python import time def display_progress_bar(total_time): print('{:-^18}'.format('开始')) # 打印开始标志 for ...

    【精】java上传进度条

    标签中的"java进度条"和"java非控件进度条"提示我们,这里的进度条不是指图形用户界面(GUI)中的组件,而是一种非图形化的进度表示,可能是在网页或者命令行应用中以文本形式显示。 对于Java Web应用,一种常见...

    python控制台中实现进度条功能

    通过本文的介绍,我们学习了如何在Python控制台中实现进度条功能,包括基本的原理和技术要点,以及如何解决常见的问题。通过使用 `sys.stdout.write()` 和 `\r` 转义字符,我们可以轻松地实现在控制台中更新进度条的...

    采用dwr+ajax和struts开发文件上传进度条

    #### 三、实现原理 - **前端**:使用HTML表单来收集用户选择的文件,并利用AJAX技术进行异步提交。同时,利用DWR实现JavaScript与Java后端服务之间的通信,实时获取文件上传进度。 - **后端**:服务器端接收前端...

    matlab开发-progressbar.zip.zip

    同时,理解进度条的工作原理和实现方式也能帮助开发者更好地理解MATLAB的图形用户界面和进程管理机制。 为了深入学习和实践,建议解压文件后仔细阅读代码和文档,尝试运行示例,理解并应用到自己的项目中。同时,...

    进度条TextProgress

    在IT行业中,尤其是在软件开发和用户界面设计领域,进度条是一种常见的可视化元素,用于...在实际开发过程中,掌握TextProgress的使用和原理,能够帮助我们更高效地实现进度显示功能,提升软件的可交互性和用户满意度。

    python动态进度条的实现代码

    接下来,我们将通过两个示例来具体展示如何实现动态进度条。 ##### 示例1:简单动态进度显示 ```python import time for i in range(10): print('\r比例:', i / 10, end='') # 使用\r将光标移动到行首,更新进度...

    基于java的FTP客户端设计与实现

    在IT领域,FTP(File Transfer Protocol)是一种广泛用于在互联网上进行文件传输的标准协议。...通过深入理解和实现这个项目,开发者不仅能掌握FTP客户端的开发,还能进一步提升在网络通信和文件操作方面的技能。

    完整版自定义进度复制文件例子.e.rar

    例如,使用Python的`tqdm`库可以轻松创建一个命令行进度条,而在Windows上,可以使用`CreateProgressIndicator` API创建一个图形进度条。对于Web应用,HTML5的`&lt;progress&gt;`元素和JavaScript可以用来创建实时更新的...

    视频压缩+自定义进度条动画FFmpegDemo-master.zip

    综上所述,FFmpegDemo-master项目是一个集成视频压缩、进度条动画、权限管理和自定义搜索框功能的Android示例应用,它展示了如何在Android开发中利用FFmpeg进行视频处理,并结合其他UI组件和库提升用户体验。...

    Linux简易彩色进度条的实例代码

    在Linux环境下,虽然我们主要通过命令行进行操作,但同样可以通过简单的编程技巧实现在终端中显示进度条。这种进度条不仅能够帮助用户了解任务的执行进度,还能提升程序的交互性和用户体验。 #### 实现原理 本篇...

Global site tag (gtag.js) - Google Analytics