Java中的命令行进度条

我有一个Java程序在命令行模式下运行。 我想显示一个进度条,显示完成工作的百分比。 在unix下使用wget可以看到同样的进度条。 这可能吗?

我之前已经实施过这样的事情。 它没有太多的关于Java,但什么字符发送到控制台。

关键是\n\r之间的区别。 \n转到新行的开始。 但\r只是回车 – 它回到同一行的开始。

所以要做的是打印你的进度条,例如打印string

 "|======== |\r" 

在进度条的下一个勾号处,用较长的条形覆盖同一条线。 (因为我们使用\ r,我们保持在同一行)例如:

 "|========= |\r" 

你必须记住要做的,是什么时候完成的,如果你只是打印

 "done!\n" 

线上的进度条可能仍然有一些垃圾。 因此,在完成进度条之后,请务必打印足够的空白符以将其从行中删除。 如:

 "done |\n" 

希望有所帮助。

我发现下面的代码正常工作。 它将字节写入输出缓冲区。 也许使用像System.out.println()方法这样的System.out.println()方法会将\r的出现replace为\n以匹配目标的本地行结尾(如果configuration不正确)。

 public class Main{ public static void main(String[] arg) throws Exception { String anim= "|/-\\"; for (int x =0 ; x < 100 ; x++) { String data = "\r" + anim.charAt(x % anim.length()) + " " + x; System.out.write(data.getBytes()); Thread.sleep(100); } } } 

C#示例,但我假设这是相同的Java中的System.out.print 。 如果我错了,随时纠正我。

基本上,你想写出\r转义字符到你的消息的开始,这将导致光标返回到行的开始(换行)而不移动到下一行。

  static string DisplayBar(int i) { StringBuilder sb = new StringBuilder(); int x = i / 2; sb.Append("|"); for (int k = 0; k < 50; k++) sb.AppendFormat("{0}", ((x <= k) ? " " : "=")); sb.Append("|"); return sb.ToString(); } static void Main(string[] args) { for (int i = 0; i <= 100; i++) { System.Threading.Thread.Sleep(200); Console.Write("\r{0} {1}% Done", DisplayBar(i), i); } Console.ReadLine(); } 

这是上面的修改版本:

 private static boolean loading = true; private static synchronized void loading(String msg) throws IOException, InterruptedException { System.out.println(msg); Thread th = new Thread() { @Override public void run() { try { System.out.write("\r|".getBytes()); while(loading) { System.out.write("-".getBytes()); Thread.sleep(500); } System.out.write("| Done \r\n".getBytes()); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }; th.start(); } 

主要是:

 loading("Calculating ..."); 

这将是可能的Java Curses库。 这是我发现的。 我自己并没有使用它,我不知道它是否是跨平台的。

当我需要推迟一个工具来防止竞争条件时,我使用“弹跳”进度条。

 private void delay(long milliseconds) { String bar = "[--------------------]"; String icon = "%"; long startTime = new Date().getTime(); boolean bouncePositive = true; int barPosition = 0; while((new Date().getTime() - startTime) < milliseconds) { if(barPosition < bar.length() && barPosition > 0) { String b1 = bar.substring(0, barPosition); String b2 = bar.substring(barPosition); System.out.print("\r Delaying: " + b1 + icon + b2); if(bouncePositive) barPosition++; else barPosition--; } if(barPosition == bar.length()) { barPosition--; bouncePositive = false; } if(barPosition == 0) { barPosition++; bouncePositive = true; } try { Thread.sleep(100); } catch (Exception e) {} } System.out.print("\n"); } 

我已经做了一个百分比进展裸检查剩余的下载文件。

我在我的文件下载中定期调用该方法来检查总文件大小,并保留并以%

它也可以用于其他任务目的。

testing和输出示例

 progressPercentage(0, 1000); [----------] 0% progressPercentage(10, 100); [*---------] 10% progressPercentage(500000, 1000000); [*****-----] 50% progressPercentage(90, 100); [*********-] 90% progressPercentage(1000, 1000); [**********] 100% 

用for循环testing

 for (int i = 0; i <= 200; i = i + 20) { progressPercentage(i, 200); try { Thread.sleep(500); } catch (Exception e) { } } 

该方法可以很容易地修改:

 public static void progressPercentage(int remain, int total) { if (remain > total) { throw new IllegalArgumentException(); } int maxBareSize = 10; // 10unit for 100% int remainProcent = ((100 * remain) / total) / maxBareSize; char defaultChar = '-'; String icon = "*"; String bare = new String(new char[maxBareSize]).replace('\0', defaultChar) + "]"; StringBuilder bareDone = new StringBuilder(); bareDone.append("["); for (int i = 0; i < remainProcent; i++) { bareDone.append(icon); } String bareRemain = bare.substring(remainProcent, bare.length()); System.out.print("\r" + bareDone + bareRemain + " " + remainProcent * 10 + "%"); if (remain == total) { System.out.print("\n"); } } 
 while (true) { System.out.write(("\r" + System.currentTimeMillis()).getBytes()); Thread.sleep(1000); } 
 public static void main(String[] argv) throws Exception{ System.out.write("\r".getBytes()); int percentage =10; while(percentage <= 100) { String temp =generateStars(percentage); System.out.write(temp.getBytes()); System.out.print("\b\b\b"); percentage = percentage+10; Thread.sleep(500); } } public static String generateStars(int percentage) { int startsNum = percentage / 4; StringBuilder builder = new StringBuilder(); while(startsNum >= 0) { builder.append("*"); startsNum--; } builder.append(percentage+"%"); return builder.toString(); }