콘솔이 사용자 입력이 닫힐 때까지 기다리도록 만들기


81

작업을 수행 한 후 "작업 완료"또는 "작업 실패"및 자세한 오류와 같은 피드백을 사용자에게 제공해야하는 콘솔 응용 프로그램이 있습니다.

문제는 "실행"만하면 출력 메시지가 인쇄되지만 콘솔은 잠시 후 닫히고 메시지를 읽을 시간이 없습니다.

내가 기억하는 한, C ++에서 모든 콘솔 애플리케이션은 "종료하려면 아무 키나 누르십시오"또는 이와 유사한 것으로 끝납니다. C #에서는이 동작을

Console.ReadKey();

그러나 Java에서 어떻게 할 수 있습니까? 저는 Scanner 클래스를 사용하고 있지만 "input"이 Scanner 인스턴스라는 점을 감안하면 다음과 같습니다.

input.next()
System.exit(0);

반환을 제외하고는 "모든 키"가 작동합니다. 이것은 여기서 상당히 큰 문제입니다. 포인터가 있습니까?

답변:


102

Java에서 이것은 System.in.read()


17
이것은 Enter 키를 누를 때까지 계속되지 않기 때문에 "종료하려면 Enter를 누르십시오"를 충족하지만 "종료하려면 아무 키나 누르십시오"는 충족하지 않습니다.
Niall Thomson

"종료하려면 Enter 키를 누르십시오"가 "종료하려면 Enter 키를 제외하고 아무 키나 누르십시오"보다 낫다고 생각합니다. 감사합니다.
마코시 치

2
@marcolopes 나는 파티에 조금 늦었지만 앱에 대해 묻기 때문에 사용자가 GUI 또는 앱 내의 다른 곳에서 Enter 키를 누르는 것이 문제라고 생각합니다. 콘솔에서 Enter 키를 눌러야하며 IDE 내에서 실행하는 경우에만 표시됩니다. 앱 내에서 Enter 키를 누르려면 다른 솔루션이 필요합니다.
Thunderforge 2013 년

4
System.in.read ()는 정확히 1 바이트를 읽지 만 ENTER는 다른 플랫폼에서 1 바이트 이상을 생성 할 수 있습니다. Windows에서는 CRLF를 기억하십시오. 따라서 후속 읽기 호출이 첫 번째 호출의 CRLF에서 LF를 직접 반환하므로 앱이 입력을 전혀 기다리지 않을 수 있습니다.
Thorsten Schöning 2015

추가 import java.io.IOException;도 필요합니다.
yu yang Jian

24

일반적으로 콘솔에 연결된 경우에만 프로그램이 기다리기를 원한다고 덧붙이고 싶습니다. 그렇지 않으면 ( 파이프 라인 의 일부인 경우 ) 메시지를 인쇄하거나 대기 할 필요가 없습니다. 이를 위해 다음 Console과 같이 Java를 사용할 수 있습니다 .

import java.io.Console;
// ...
public static void waitForEnter(String message, Object... args) {
    Console c = System.console();
    if (c != null) {
        // printf-like arguments
        if (message != null)
            c.format(message, args);
        c.format("\nPress ENTER to proceed.\n");
        c.readLine();
    }
}


7

nextLine();일시 중지로 사용할 수 있습니다.

import java.util.Scanner
//
//
Scanner scan = new Scanner(System.in);

void Read()
{
     System.out.print("Press any key to continue . . . ");
     scan.nextLine();
}

그러나 당신이 누르는 모든 버튼은 그 후에 Enter 키를 눌러야 Enter함을 의미하지만 더 나은 것을 발견했습니다.scan.next();


사용해야합니다Scanner scan=new Scanner(System.in);
ACV

5

나는 간단한 해킹을 사용하여 창에 cmd 명령을 사용하도록 요청하고 null로 보냅니다.

// Class for Different hacks for better CMD Display
import java.io.IOException;
public class CMDWindowEffets
{
    public static void getch() throws IOException, InterruptedException
    {
        new ProcessBuilder("cmd", "/c", "pause > null").inheritIO().start().waitFor();
    }    
}

3

x4u가 말한 내용을 입력했습니다. 이클립스는 주위에 try catch 블록을 원했기 때문에 그것을 생성하도록했습니다.

try {
        System.in.read();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

아마도 모든 종류의 종소리와 휘파람이있을 수 있지만 명령 줄 창을 종료하지 않으려는 초보자에게는 괜찮을 것이라고 생각합니다.

또한 이것이 얼마나 흔한 지 모르겠지만 (이것은 jar 파일을 처음 만드는 것입니다), 자체적으로 실행되지는 않으며 단지 bat 파일을 통해서만 실행됩니다.

java.exe -jar mylibrary.jar

위의 내용은 동일한 폴더에있는 bat 파일입니다. 설치 문제인 것 같습니다.

Eclipse 튜토리얼의 출처 : http://eclipsetutorial.sourceforge.net/index.html

답변 중 일부는 Oracle Thread 에서 나왔습니다.


3
public static void main(String args[])
{
    Scanner s = new Scanner(System.in);

    System.out.println("Press enter to continue.....");

    s.nextLine();   
}

이것은 nextlineEnter 키를 누를 때마다 다음 줄을 실행하는 데 도움이되므로 꽤 좋은 옵션입니다.


1

간단한 트릭 :

import java.util.Scanner;  

/* Add these codes at the end of your method ...*/

Scanner input = new Scanner(System.in);
System.out.print("Press Enter to quit...");
input.nextLine();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.