2012-08-30 2 views
6

작성중인 프로그램의 명령 행 인터페이스 부분 다중 진행 막대를 호출합니다. 나는 현재이 비슷한으로 \r 이스케이프 시퀀스를 사용하여 콘솔에서 한 줄을 업데이트 할 수 있습니다Java 명령 행 인터페이스 : ' r'을 사용하여 여러 행에 여러 진행 막대 표시

System.out.printf("\rProcess is %d%% complete", percentageComplete); 

캐리지 리턴은 해당 라인의 시작으로 거슬러 올라갑니다 그러나. 나는 두 줄 (또는 좀 더 일반적으로, 줄 수)으로 돌아가서 둘 다/모두 업데이트하도록하고 싶다.

이렇게하는 방법이 있습니까?

+1

쉽지 않습니다. 이 질문을 확인하십시오. http://stackoverflow.com/questions/1001335/java-gotoxyx-y-for-console-applications?lq=1 http://stackoverflow.com/questions/4906141/move-printing -position-of-command-line-in-java-in-external-using-external? lq = 1 http://stackoverflow.com/questions/439799/whats-a-good-java-curses- 터미널 응용 프로그램과 같은 라이브러리 – Flavio

답변

2

불행히도 커서를 위로 이동시키는 \r과 같은 의미는 없습니다. 그러나 이것은 ANSI 호환 터미널을 사용하고 있다고 가정 할 수있는 한 ANSI 이스케이프 시퀀스를 사용하여 수행 할 수 있습니다.

는 ANSI 코드로 유일한 문제는 당신이

System.out.printf(((char) 0x1b) + "[1A\r" + "Item 1: %d ", progress1); 
System.out.printf(((char) 0x1b) + "[1B\r" + "Item 2: %d ", progress2); 

할 수있는, ANSI 코드를 사용하여 진행 막대를 인쇄하려면, 거의 모든 단말기가 ANSI 코드를 사용하는 동안, the Win32 Terminal doesn't. 나는 그것을 테스트하지 않았지만 this library은 Windows 터미널을 기본으로 지원해야하는지 여부를 살펴 보는 것이 좋습니다. 여기에는 Windows 터미널에서 동일한 작업을 수행하는 JNI 라이브러리가 포함되어 있으며 JNI 라이브러리 또는 ANSI 코드를 사용할지 여부를 자동으로 결정합니다. 또한 ANSI 코드를 약간 더 쉽게 사용할 수 있도록하는 몇 가지 방법이 있습니다.

4

하나의 라이너 또는 "마스터/디테일"을 수행 할 수있는 명령 줄 진행 막대를위한 작은 프로젝트를 작성했습니다 (https://github.com/tomas-langer/cli/tree/master/cli-progress 참조). 또한 Windows에서 작동합니다 - MS Windows (Chalk + Jansi)의 기본 구현과 함께 ANSI 이스케이프 시퀀스 사용

더 많은 작업을 원할 경우 다시 Jansi를 사용하는 Chalk 라이브러리 (이전 게시물에서 이미 언급 했음)를 확인하십시오.).

라인 업 및 클리어 라인을위한 ansi 이스케이프 코드는 초크 라이브러리에 있습니다. 사용 방법 :

import com.github.tomaslanger.chalk.Ansi; 
... 
System.out.print(Ansi.cursorUp(2)); //move cursor up two lines 
System.out.print(Ansi.eraseLine()); //erase current line