[java] Java의 콘솔에서 단일 문자를 읽는 방법 (사용자가 입력 할 때)?

사용자가 Java로 입력 할 때 콘솔에서 단일 문자를 읽는 쉬운 방법이 있습니까? 가능할까요? 나는 이러한 방법으로 시도했다 그러나 그들은 언론에 사용자에 대한 모든 대기는 입력 키 :

char tmp = (char) System.in.read();
char tmp = (char) new InputStreamReader(System.in).read ();
char tmp = (char) System.console().reader().read();           // Java 6

Enter 를 누를 때까지 System.in이 사용자 입력을 인식하지 못한다고 생각하기 시작했습니다 .



답변

원하는 것은 “cooked”모드 (Enter 키가 필요한 라인 편집)와는 반대로 콘솔을 “raw”모드 (라인 편집 생략 및 Enter 키 필요 없음)로 설정하는 것입니다. UNIX 시스템에서 ‘stty’명령은 다음을 수행 할 수 있습니다. 모드를 변경하십시오.

이제 Java와 관련하여 … Python 및 Java의 Non blocking console input을 참조하십시오 . 발췌 :

프로그램이 콘솔 기반이어야하는 경우 터미널을 라인 모드에서 문자 모드로 전환해야하며 프로그램이 종료되기 전에 복원해야합니다. 운영 체제간에이를 수행 할 수있는 이식 가능한 방법은 없습니다.

제안 중 하나는 JNI를 사용하는 것입니다. 다시 말하지만, 그것은 그다지 이식성이 없습니다. 스레드 끝에서 그리고 위의 게시물과 공통적으로 다른 제안은 jCurses 사용을 살펴 보는 입니다.


답변

콘솔을 원시 모드로 두어야합니다. 플랫폼에 독립적 인 기본 제공 방법은 없습니다. 하지만 jCurses흥미로울 수 있습니다.

Unix 시스템에서는 다음과 같이 작동 할 수 있습니다.

String[] cmd = {"/bin/sh", "-c", "stty raw </dev/tty"};
Runtime.getRuntime().exec(cmd).waitFor();

예를 들어, 키 입력 사이의 시간을 고려하려는 경우 여기에 도달 할 수있는 샘플 코드가 있습니다.


답변

Java 콘솔에서 원시 문자를 읽을 수있는 이식 가능한 방법은 없습니다.

위에 제시된 일부 플랫폼에 따른 해결 방법이 있습니다. 그러나 정말 휴대하기 위해서는 콘솔 모드를 포기하고 AWT 또는 Swing과 같은 윈도우 모드를 사용해야합니다.


답변

JNA 를 사용 하여 Windows 및 Unix / Linux의 운영 체제 기능을 호출 하는 Java 클래스 RawConsoleInput 을 작성했습니다 .

  • Windows의 경우는 사용 _kbhit()_getwch()MSVCRT.DLL에서.
  • Unix에서는 tcsetattr()콘솔을 비표준 모드로 전환하고 System.in.available()데이터를 사용할 수 있는지 확인 System.in.read()하고 콘솔에서 바이트를 읽는 데 사용합니다. A CharsetDecoder는 바이트를 문자로 변환하는 데 사용됩니다.

Non-blocking 입력과 혼합 raw 모드와 일반 라인 모드 입력을 지원합니다.


답변

jline3 사용 :

예:

Terminal terminal = TerminalBuilder.builder()
    .jna(true)
    .system(true)
    .build();

// raw mode means we get keypresses rather than line buffered input
terminal.enterRawMode();
reader = terminal .reader();
...
int read = reader.read();
....
reader.close();
terminal.close();


답변