2011-01-01 6 views
23

के बिना कमांड लाइन में टेक्स्ट अपडेट करना मैं कमांड लाइन जावा प्रोग्राम में एक प्रगति सूचक जोड़ना चाहता हूं।जावा: एक नई लाइन

उदाहरण के लिए, अगर मैं wget का उपयोग कर रहा है, यह पता चलता है:

71% [===========================>   ] 358,756,352 51.2M/s eta 3s 

क्या यह संभव है एक प्रगति संकेतक के लिए है कि तह तक एक नई लाइन जोड़ने के बिना अद्यतन?

धन्यवाद।

+0

@rfeak क्षमा करें, http://stackoverflow.com/questions/1001290/console-based-progress-in-java – TheLQ

उत्तर

27

सबसे पहले जब आप लिखते हैं, तो readeln() का उपयोग न करें। लिखें() का प्रयोग करें। दूसरा, आप बिना किसी नई लाइन के \ "कैरिज रिटर्न में" \ r "का उपयोग कर सकते हैं। कैरिज रिटर्न आपको लाइन की शुरुआत में वापस रखेगा।

+7

लेकिन यदि पाठ की लंबाई संभवतः कम हो सकती है (उदाहरण के लिए, ईटीए को प्रदर्शित करने के लिए आवश्यक अंकों की संख्या घट जाती है), पुराने अक्षरों पर रिक्त स्थान लिखना याद रखें ताकि वे और दिखाई न दें। संपादित करें: इसके अलावा, यह सुनिश्चित करने के लिए System.out.flush() को याद रखना याद रखें कि पाठ वास्तव में दिखाई देता है (उदा। लाइन-बफर्ड टर्मिनल पर)। – jstanley

+0

@jstanley - याद रखने के लिए अच्छे अंक। – rfeak

23

मैं निम्नलिखित का उपयोग कोड:

public static void main(String[] args) { 
    long total = 235; 
    long startTime = System.currentTimeMillis(); 

    for (int i = 1; i <= total; i = i + 3) { 
     try { 
      Thread.sleep(50); 
      printProgress(startTime, total, i); 
     } catch (InterruptedException e) { 
     } 
    } 
} 


private static void printProgress(long startTime, long total, long current) { 
    long eta = current == 0 ? 0 : 
     (total - current) * (System.currentTimeMillis() - startTime)/current; 

    String etaHms = current == 0 ? "N/A" : 
      String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(eta), 
        TimeUnit.MILLISECONDS.toMinutes(eta) % TimeUnit.HOURS.toMinutes(1), 
        TimeUnit.MILLISECONDS.toSeconds(eta) % TimeUnit.MINUTES.toSeconds(1)); 

    StringBuilder string = new StringBuilder(140); 
    int percent = (int) (current * 100/total); 
    string 
     .append('\r') 
     .append(String.join("", Collections.nCopies(percent == 0 ? 2 : 2 - (int) (Math.log10(percent)), " "))) 
     .append(String.format(" %d%% [", percent)) 
     .append(String.join("", Collections.nCopies(percent, "="))) 
     .append('>') 
     .append(String.join("", Collections.nCopies(100 - percent, " "))) 
     .append(']') 
     .append(String.join("", Collections.nCopies((int) (Math.log10(total)) - (int) (Math.log10(current)), " "))) 
     .append(String.format(" %d/%d, ETA: %s", current, total, etaHms)); 

    System.out.print(string); 
} 

परिणाम: enter image description here