자바 : 콘솔 지우기


답변:


111

Windows에서 작동하지 않는 코드를 보여주는 몇 가지 답변이 있으므로 여기에 설명이 있습니다.

Runtime.getRuntime().exec("cls");

이 명령은 다음 두 가지 이유로 작동 하지 않습니다 .

  1. 잘 알려진 명령 은 Windows의 명령 줄 인터프리터에 내장되어 있으므로을 통해 호출 할 수있는 명명 된 cls.exe또는 cls.com표준 Windows 설치 에는 실행 파일이 없습니다 .Runtime.execcls

  2. 를 통해 새 프로세스를 시작 Runtime.exec하면 표준 출력이 시작 Java 프로세스가 읽을 수있는 파이프로 리디렉션됩니다. 그러나 cls명령 출력 이 리디렉션 될 때 콘솔이 지워지지 않습니다.

이 문제를 해결하려면 명령 줄 인터프리터 ( cmd) /c cls를 호출하고 내장 명령을 호출 할 수 있는 명령 ( ) 을 실행하도록 지시해야 합니다. 또한 출력 채널을 Java 프로세스의 출력 채널에 직접 연결해야합니다.이 채널은 Java 7부터 다음을 사용하여 작동합니다 inheritIO().

import java.io.IOException;

public class CLS {
    public static void main(String... arg) throws IOException, InterruptedException {
        new ProcessBuilder("cmd", "/c", "cls").inheritIO().start().waitFor();
    }
}

이제 Java 프로세스가 콘솔에 연결되면 (예 : 출력 경로 재 지정없이 명령 행에서 시작된 경우) 콘솔이 지워집니다.


1
왜 이것이 작동하지 않습니까? Windows CMD에서 프로그램을 실행했지만 화면이 지워지지 않았습니다.
Alist3r

87

다음 코드를 사용하여 명령 행 콘솔을 지울 수 있습니다.

public static void clearScreen() {  
    System.out.print("\033[H\033[2J");  
    System.out.flush();  
}  

자세한 내용은 http://techno-terminal.blogspot.in/2014/12/clear-command-line-console-and-bold.html을 참조하십시오.


2
이것에 전혀 관심이 있습니까? 이 문자열은 무엇이며 자동 플러시가 활성화 된 경우 플러시해야합니까?
cossacksman

7
그것들은 ANSI 이스케이프 코드 입니다. 특히 화면이 깨끗하고 홈이옵니다 . 그러나 왜 '집'이 필요한가?
jdurston

2
@jdurston을 생략하면 커서가 창 상단으로 다시 재설정되지 않습니다.
휴고 Zink

1
Eclipse에서는 작동하지 않지만 Linux 터미널에서는 작동합니다. 하나의 투표
Anh Tuan

7
Java가 실행되는 터미널 에뮬레이터가 ANSI 이스케이프 코드를 지원하는 경우에만 작동합니다. 윈도우 NT / XP / 7 / 10분의 8 CMD하지 않습니다
Thorbjørn Ravn 안데르센에게

19

이것이 내가 처리하는 방법입니다. 이 방법은 Windows OS 및 Linux / Unix OS에서 작동합니다 (Mac OS X에서도 작동 함).

public final static void clearConsole()
{
    try
    {
        final String os = System.getProperty("os.name");

        if (os.contains("Windows"))
        {
            Runtime.getRuntime().exec("cls");
        }
        else
        {
            Runtime.getRuntime().exec("clear");
        }
    }
    catch (final Exception e)
    {
        //  Handle any exceptions.
    }
}

이 방법은 일반적으로 IDE 내부에서 실행중인 경우 콘솔을 지우지 않습니다 .


10
Windows 8.1 :java.io.IOException: Cannot run program "cls": CreateProcess error=2, The system cannot find the file specified
Ben Leggiero

1
@BenLeggiero 어떤 이유로 PATH 환경 변수의 일부 디렉토리 내에서 JVM이 cls 명령을 찾지 못하면이 오류가 발생합니다. 이 코드는 기본 시스템 구성에 따라 Windows 또는 Unix 시스템 명령을 호출하여 명령 프롬프트 또는 터미널 창을 각각 지우는 것입니다. 터미널 창을 열고 "cls"를 입력 한 다음 Enter 키를 입력하는 것과 정확히 동일해야합니다.
Dyndrilliac

22
clsWindows 에는 실행 파일 이 없습니다 . 의 내부 명령입니다 cmd.exe.
a_horse_with_no_name

7
다른 사람들이 말했듯이 Windows에는 cls 실행 파일이 없기 때문에뿐만 아니라 하위 프로세스의 출력이 리디렉션되기 때문에 전혀 작동하지 않습니다 .
Holger

2
이 답변은 메타에 대한 주제이기도합니다. meta.stackoverflow.com/questions/308950/…
Petter Friberg

15

이것을 얻는 방법은 여러 줄의 끝 ( "\ n")을 인쇄하고 선명한 화면을 시뮬레이션하는 것입니다. 마지막으로 유닉스 쉘에서 대부분 이전 내용을 제거하지 않고 위로 이동하고 아래로 스크롤하면 이전 내용을 볼 수 있습니다.

다음은 샘플 코드입니다.

for (int i = 0; i < 50; ++i) System.out.println();

13
이를 수행하는 가장 빠른 방법 은 호출 간에 눈에 띄는 지연이 있기 때문에 단일 문자열로 단일 문자열 50 \r\n을 인쇄하는 것 입니다. printlnprintln
Ben Leggiero

7
콘솔이 얼마나 많은 라인을 표시하도록 구성되어 있는지 어떻게 알 수 있습니까? 대부분의 경우 효과가있을 수 있지만 전부는 아닙니다.
Cypher

4
이것과 적절한 것의 가장 큰 차이점 clear은 후자의 경우 새로운 출력이 화면의 상단이 아니라 하단의 상단에 있다는 것입니다.
ndm13

5
System.out.println(new String(new char[50]).replace("\0", "\r\n"));일을 더 빠르고 더 잘할 것입니다.
Aaron Esau

1
@AaronEsau JDK 11부터 사용할 수 있습니다System.out.println(System.lineSeparator().repeat(50));
Holger

15

시스템 독립적 인 방법으로이 작업을 수행하려면 JLine 라이브러리 및 ConsoleReader.clearScreen ()을 사용할 수 있습니다 . 현재 환경에서 JLine 및 ANSI가 지원 되는지 여부를 신중하게 확인 하는 것도 좋습니다.

다음 코드와 같은 것이 나를 위해 일했습니다.

import jline.console.ConsoleReader;

public class JLineTest
{
    public static void main(String... args)
    throws Exception
    {
        ConsoleReader r = new ConsoleReader();

        while (true)
        {
            r.println("Good morning");
            r.flush();

            String input = r.readLine("prompt>");

            if ("clear".equals(input))
                r.clearScreen();
            else if ("exit".equals(input))
                return;
            else
                System.out.println("You typed '" + input + "'.");

        }
    }
}

이 명령을 실행할 때 프롬프트에 'clear'를 입력하면 화면이 지워집니다. Eclipse가 아닌 적절한 터미널 / 콘솔에서 실행해야합니다.


14

클래스에서 다음과 같이 메소드를 작성 하십시오 . [ @Holger여기에서 말했듯이 ]

public static void clrscr(){
    //Clears Screen in java
    try {
        if (System.getProperty("os.name").contains("Windows"))
            new ProcessBuilder("cmd", "/c", "cls").inheritIO().start().waitFor();
        else
            Runtime.getRuntime().exec("clear");
    } catch (IOException | InterruptedException ex) {}
}

이것은 적어도 Windows에서는 작동하지만 지금까지 Linux를 확인하지 않았습니다. 누구나 Linux를 확인하면 작동하는지 알려주세요.

다른 방법 으로이 코드를 작성하는 것입니다 clrscr():

for(int i = 0; i < 80*300; i++) // Default Height of cmd is 300 and Default width is 80
    System.out.print("\b"); // Prints a backspace

이 방법을 사용하지 않는 것이 좋습니다.


1
Windows 10에서 잘 작동합니다!
gaurav

7

XP. 노트북에서 Runtime.getRuntime (). exec (cls)가 작동하지 않았습니다. 이것은-

for(int clear = 0; clear < 1000; clear++)
  {
     System.out.println("\b") ;
  }

이것이 유용하기를 바랍니다


버퍼 인덱스 위치를 시작하도록 설정할 수 있다면 이것이 가장 쉬운 방법 일 것입니다
DevilInDisguise

1
프로세스가 중단되면 print.out이 다른 것들보다 먼저 제거되어 지연이 발생한다고 생각합니다.
TrevorLee

7

다음을 시도하십시오.

System.out.print("\033\143");

이것은 Linux 환경에서 잘 작동합니다


2

Bluej 또는 다른 유사한 소프트웨어에서이 작업을 수행하는 경우 작동합니다.

System.out.print('\u000C');

1

당신의 에뮬레이션을 사용할 수 있습니다 cls로를 for (int i = 0; i < 50; ++i) System.out.println();


2
그냥 힌트일지도 모릅니다. 누군가 화면을 지우고 싶을 수도 있습니다. 실제로
Sarz

@Sarz : 그리고 실제로 "화면 지우기"는 그 자체로도 의미가 없습니다.
Gyom

0

제어 문자를 백 슬래시 (\ b) 및 캐리지 리턴 (\ r)으로 사용해야합니다. 기본적으로 비활성화되어 있지만 콘솔보기에서 이러한 컨트롤을 해석 할 수 있습니다.

Windows> 환경 설정실행 / 디버그> 콘솔 에서 ASCII 제어 문자 해석을 선택 하여 사용으로 설정하십시오.

Eclipse의 콘솔 환경 설정

이러한 구성 후에는 다음과 같은 제어 문자로 콘솔을 관리 할 수 ​​있습니다.

\ t-탭.

\ b-백 스페이스 (텍스트에서 한 단계 뒤로 이동하거나 단일 문자 삭제).

\ n-줄 바꿈.

\ r-캐리지 리턴 ()

\ f-양식 피드.

이클립스 콘솔 클리어 애니메이션

자세한 정보 : https://www.eclipse.org/eclipse/news/4.14/platform.php


-2

JNI를 사용해야합니다.

우선 Visual Studio를 사용하여 호출 시스템 ( "cls")을 사용하여 .dll을 만듭니다. 그런 다음 JNI를 사용하여이 DDL을 사용하십시오.

이 기사가 훌륭하다는 것을 알았습니다.

http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=5170&lngWId=2


그것은 나에게 일이다. JNI를 사용하여 JAVA에서 화면을 지우는 실제 프로젝트가 있습니다.
데니

헝가리에서는 "그가 메이스로 파리를 쳤다"고 말합니다.
Ambrus Tóth
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.