development

같은 줄에 인쇄하려면 어떻게해야합니까?

big-blog 2020. 12. 29. 08:22
반응형

같은 줄에 인쇄하려면 어떻게해야합니까?


다음과 같이 진행률 표시 줄을 인쇄하고 싶습니다.

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

그러나 이것들은 모두 새 것이 아니라 터미널의 같은 줄에 인쇄되어야합니다. 내가 의미하는 것은 각각의 새 줄이 이전 줄을 대체해야한다는 print()것입니다 println().

Java에서 어떻게 할 수 있습니까?


다음과 같이 문자열 형식을 지정하십시오.

[#                    ] 1%\r

\r캐릭터에 유의하십시오 . 커서를 줄의 시작 부분으로 다시 이동시키는 것은 소위 캐리지 리턴 입니다.

마지막으로

System.out.print()

그리고 아닙니다

System.out.println()

Linux에는 제어 터미널에 대해 다른 이스케이프 시퀀스가 ​​있습니다. 예를 들어, 전체 줄 지우기 \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?).


먼저이 질문을 다시 제기 한 것에 대해 사과하고 싶지만 다른 답변을 사용할 수 있다고 생각했습니다.

데릭 슐츠가 맞습니다. '\ b'문자는 인쇄 커서를 한 문자 뒤로 이동하여 거기에 인쇄 된 문자를 덮어 쓸 수 있습니다 (새 정보를 맨 위에 인쇄하지 않는 한 전체 줄이나 거기에 있던 문자도 삭제하지 않습니다). 다음은 형식을 따르지 않지만 Java를 사용하는 진행률 표시 줄의 예입니다. 문자 덮어 쓰기의 핵심 문제를 해결하는 방법을 보여줍니다 (32 비트 시스템에서 Oracle의 Java 7을 사용하는 Ubuntu 12.04에서만 테스트되었습니다. 그러나 모든 Java 시스템에서 작동합니다) :

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();
    }
}

업데이트 된 진행률 표시 줄을 인쇄하기 전에 줄을 삭제하는 데 필요한만큼 백 스페이스 문자 '\ b'를 인쇄 할 수 있습니다.


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();
    }
}

참조 URL : https://stackoverflow.com/questions/7939802/how-can-i-print-to-the-same-line

반응형