java 返回进度条_Java中的命令行进度条
我之前已經實施過這樣的事情。 它沒有太多的關于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(); }
總結
以上是生活随笔為你收集整理的java 返回进度条_Java中的命令行进度条的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PLC编程语言入门,常用指令集汇总分享
- 下一篇: linux的串口驱动分析