java software मैं एक ही पंक्ति में कैसे प्रिंट कर सकता हूं?




java verify (4)

मैं एक प्रगति पट्टी मुद्रित करना चाहता हूं:

[#                    ] 1%
[##                   ] 10%
[##########           ] 50%

लेकिन इन्हें सभी को एक नए लाइन के बजाय टर्मिनल में एक ही पंक्ति में मुद्रित किया जाना चाहिए। मेरा मतलब यह है कि प्रत्येक नई लाइन को पिछले स्थान को प्रतिस्थापित करना चाहिए, यह println() बजाय print() का उपयोग print() बारे में नहीं है।

मैं जावा में ऐसा कैसे कर सकता हूं?


सबसे पहले, मैं इस सवाल को वापस लाने के लिए क्षमा चाहता हूं, लेकिन मुझे लगा कि यह एक और जवाब का उपयोग कर सकता है।

डेरेक Schultz सही तरह का है। '\ B' चरित्र प्रिंटिंग कर्सर को एक वर्ण पीछे ले जाता है, जिससे आप उस प्रिंटर को ओवरराइट कर सकते हैं जो वहां मुद्रित था (यह पूरी लाइन या यहां तक ​​कि उस चरित्र को तब तक नहीं हटाता जब तक आप शीर्ष पर नई जानकारी प्रिंट नहीं करते)। निम्नलिखित जावा का उपयोग कर प्रगति पट्टी का एक उदाहरण है, हालांकि यह आपके प्रारूप का पालन नहीं करता है, यह दिखाता है कि ओवरराइटिंग वर्णों की मूल समस्या को कैसे हल किया जाए (यह केवल 32-बिट मशीन पर ओरेकल के जावा 7 के साथ उबंटू 12.04 में परीक्षण किया गया है, लेकिन यह सभी जावा सिस्टम पर काम करना चाहिए):

public class BackSpaceCharacterTest
{
    // the exception comes from the use of accessing the main thread
    public static void main(String[] args) throws InterruptedException
    {
        /*
            Notice the user of print as opposed to println:
            the '\b' char cannot go over the new line char.
        */
        System.out.print("Start[          ]");
        System.out.flush(); // the flush method prints it to the screen

        // 11 '\b' chars: 1 for the ']', the rest are for the spaces
        System.out.print("\b\b\b\b\b\b\b\b\b\b\b");
        System.out.flush();
        Thread.sleep(500); // just to make it easy to see the changes

        for(int i = 0; i < 10; i++)
        {
            System.out.print("."); //overwrites a space
            System.out.flush();
            Thread.sleep(100);
        }

        System.out.print("] Done\n"); //overwrites the ']' + adds chars
        System.out.flush();
    }
}

package org.surthi.tutorial.concurrency;

public class IncrementalPrintingSystem {
    public static void main(String...args) {
        new Thread(()-> {
           int i = 0;
           while(i++ < 100) {
               System.out.print("[");
               int j=0;
               while(j++<i){
                  System.out.print("#");
               }
               while(j++<100){
                  System.out.print(" ");
               }
               System.out.print("] : "+ i+"%");
               try {
                  Thread.sleep(1000l);
               } catch (InterruptedException e) {
                  e.printStackTrace();
               }
               System.out.print("\r");
           }
        }).start();
    }
}

लिनक्स में, नियंत्रण टर्मिनल के लिए अलग-अलग भागने के दृश्य हैं। उदाहरण के लिए, पूरी लाइन मिटाने के लिए विशेष भागने का अनुक्रम है: \33[2K और कर्सर को पिछली पंक्ति में ले जाने के लिए: \33[1A । इसलिए जब भी आपको लाइन रीफ्रेश करने की आवश्यकता होती है तो आपको इसे प्रिंट करना होगा। यहां कोड है जो Line 1 (second variant) प्रिंट करता है:

System.out.println("Line 1 (first variant)");
System.out.print("\33[1A\33[2K");
System.out.println("Line 1 (second variant)");

कर्सर नेविगेशन, क्लियरिंग स्क्रीन आदि के लिए कोड हैं।

मुझे लगता है कि कुछ पुस्तकालय हैं जो इसके साथ मदद करते हैं ( ncurses ?)।


अपडेटेड प्रोग्रेस बार प्रिंट करने से पहले लाइन को हटाने के लिए आप जितनी बार आवश्यक हो सके बैकस्पेस कैरेक्टर 'बी' प्रिंट कर सकते हैं।







java