같은 줄에 인쇄하려면 어떻게해야합니까?
다음과 같이 진행률 표시 줄을 인쇄하고 싶습니다.
[# ] 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
'development' 카테고리의 다른 글
UITableViewCell 배경색이 작동하지 않는 이유는 무엇입니까 (인터페이스 빌더에서 설정)? (0) | 2020.12.29 |
---|---|
Dapper는 like 연산자를 지원합니까? (0) | 2020.12.29 |
전역 신규 및 삭제 연산자를 올바르게 대체하는 방법 (0) | 2020.12.29 |
TeamCity Nuget Feed에서 특정 버전의 패키지를 제거하는 방법은 무엇입니까? (0) | 2020.12.29 |
CDI : beans.xml, 어디에 두어야합니까? (0) | 2020.12.29 |