Java控制台输出进度条

  1. 源码
package com.yang.restdemo.util;

import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;

/**
 * @description: 进度条
 * @author: Yang JianXiong
 * @since: 2022/11/26
 */
public class ProgressBar {

    private static final int TOTAL = 100;
    private static final char BACK_GROUND = '░';
    private static final char FRONT_GROUND = '█';

    public static void main(String[] args) throws InterruptedException {

        StringBuilder stringBuilder = new StringBuilder();
        Stream.generate(() -> BACK_GROUND).limit(TOTAL).forEach(stringBuilder::append);

        for (int i = 0; i < TOTAL; i++) {
            stringBuilder.replace(i, i + 1, String.valueOf(FRONT_GROUND));
            String bar = "\r" + stringBuilder;
            String percent = " " + (1 + i) + "%";

            // 输出绿色进度条
            System.out.print(ProgressBar.ColorEnum.GREEN.getValue() + bar + percent);

            // 防止打印太快,方便观察
            TimeUnit.MILLISECONDS.sleep(i * 10L);
        }
    }

    /**
     * 颜色枚举
     */
    enum ColorEnum {

        /**
         * 白色
         */
        WHITE("\33[0m"),

        /**
         * 红色
         */
        RED("\33[1m\33[31m"),

        /**
         * 绿色
         */
        GREEN("\33[1m\33[32m"),

        /**
         * 黄色
         */
        YELLOW("\33[1m\33[33m"),

        /**
         * 蓝色
         */
        BLUE("\33[1m\33[34m"),

        /**
         * 粉色
         */
        PINK("\33[1m\33[35m"),

        /**
         * 青色
         */
        CYAN("\33[1m\33[36m");

        /**
         * 颜色值
         */
        private String value;

        ColorEnum(String value) {
            this.value = value;
        }

        public String getValue() {
            return value;
        }

    }

}
  1. 输出效果
██████████████████████████████████████████████████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ 58%
  1. Rust版本:
use std::io::{Result, stdout, Write};
use std::thread::sleep;
use std::time::Duration;

fn main() -> Result<()> {
    const BAR_LAB: &str = "-\\|/";
    for prec in 0..=100 {
        print!(
            "\r {} \u{1b}[42m{}\u{1b}[0m [ {}%] ",
            BAR_LAB.chars().nth(prec % 4).unwrap(),
            " ".repeat(prec / 2),
            prec
        );
        stdout().flush()?;
        sleep(Duration::from_micros(60_000));
    }
    println!();
    Ok(());
}
posted @ 2022-11-26 21:56  JaxYoun  阅读(933)  评论(0编辑  收藏  举报