JAVA如何在IDEA控制台中制作进度条?

JAVA如何在IDEA控制台中制作进度条?,java,intellij-idea,Java,Intellij Idea,我希望在循环中使用进度条进行测试运行,但我的函数仅在循环结束时显示完整的进度条 static void testProgress(int all, int now) { float num = (float) (now/(all*0.1); int current = (int) (num/1); int rest = 10 - current; System.out.print("\r["); for(i

我希望在循环中使用进度条进行测试运行,但我的函数仅在循环结束时显示完整的进度条

static void testProgress(int all, int now)
    {
        float num = (float) (now/(all*0.1);
        int current = (int) (num/1);
        int rest = 10 - current;

        System.out.print("\r[");
        for(int a=1;a<=current;a++)
        {
            System.out.print("|");
        }
        for(int b=1;b<=rest;b++)
        {
            System.out.print(" ");
        }
        System.out.print("]");

    }
static void testProgress(int all,int now)
{
浮点数=(浮点)(现在/(全部*0.1);
int当前=(int)(num/1);
int rest=10-电流;
系统输出打印(“\r[”);

对于(int a=1;一个问题是,通过只调用
System.out.print
方法将所有值写入一行,并反复覆盖现有的控制台输出字符串

请尝试使用类似以下内容转到下一行:

System.out.print("]");
System.out.println();//inserts new line
或更简洁的版本:

System.out.print("]\n");//\n inserts new line

要回答您的问题,对于IntelliJ console,无法简单地覆盖旧进度条并输出新的进度条。在Windows命令行(我假设是Unix系统)上,您可以按如下方式打印进度条并覆盖(使用
system.out.print
,以及
'\r'
)。还可以制作更具可读性的进度条(通过更改值
MAX\u PIPE\u CHAR
,您可以随意加宽和缩短进度条):

public class Tester {
    static void testProgress(int all, int now) {
        final int MAX_PIPE_CHAR = 10;
        float num = now * MAX_PIPE_CHAR * 1.01f; // 1.01f to account for any round off
        int current = (int) (num / all);
        int rest = MAX_PIPE_CHAR - current;

        System.out.print("\r[");
        for (int a = 1; a <= current; a++) {
            System.out.print("|");
        }
        for (int b = 1; b <= rest; b++) {
            System.out.print(" ");
        }
        System.out.print("]");

    }

    public static void main (String args[]){
        for (int i = 0; i <= 100; i++) { // to test, taken from Aleksandar (slight modification)
            testProgress(100, i);
            try {
                Thread.sleep(30);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

您得到了覆盖自身的进度条(在Windows上测试)。

并且应该知道“now”是如何递增的?或者何时调用此方法?此外,您使用
float num=(float)(now/(all*0.1);int current=(int)(num/1)到底想要实现什么
这是一个尖锐的逻辑错误。我在循环中使用这个函数,“现在”是循环的一步。我正在使用
float num=(float)(现在/(all*0.1);int current=(int)
通过循环的亮度和当前的一步来获取进度条的当前位置。那么,为什么当前
int current=(int)((float)(now*MAX\u PIPE\u CHAR))/all);
?管道字符是
|
,如果您不知道的话。0.1似乎非常随意。我希望我的进度条始终是相同的。另外,
(int)(num/1)
相当于
(int)num
。变量
num
被视为浮点,因此
/1
将只将浮点除以1(与除以1.0f相同)并返回float(不进行地板分割)。请看我的回答,看看我说的
int current=(int)((float)(现在是MAX_PIPE_CHAR))/all时的意思
我们的目标是重新编写这一行!使它看起来像真正的进度条,但它只显示完整的进度条……这意味着您的过程结束得非常快。我用调试器检查了您的代码-函数在每一步都打印正确的数据,但随后它就消失了overwritten@DmitryFeniksIDK如果IntelliJ控制台提供足够的控制来显示正在重新绘制进度条。命令行可能会,但事情可能会变得复杂。您可以将
1.01f
设置为
1.001f
。重点是在处理浮点乘法/除法时考虑舍入错误。
java Tester