2017-02-28 5 views
0

나는 사용자가 차례로 게임에 대한 입력을 제공하는 클라이언트/서버 게임을 가지고있다. 내가 무시할 차례가 아닐 때 사용자 유형을 원한다. 사용자가 메시지를받은 후 제공하는 입력 만 검사하려고합니다. 입력에 java.util.Scanner를 사용하고 있지만 프로그램이 멈추지 않고 스캐너 버퍼를 "플러시"할 수있는 방법을 찾을 수 없습니다. 또한 내가 원하는 것을 수행하는 다른 입력 읽기 방법의 예를 찾을 수 없습니다.프롬프트 전에 입력 버퍼를 지우려면 입력 버퍼를 지울 수 있습니까?

이것은 내가 뭘하려 :

Scanner in = new Scanner(System.in); 
    //do game stuff 
    //I don't care about anything typed at this time 
while(in.hasNextLine()){ 
    in.nextLine(); 
} 

System.out.println("Enter your move:"); 
String input = in.nextLine(); 
+0

버퍼없는 터미널 io (기본 라이브러리 사용)를 사용하지 않고 원하는 것을 수행 할 방법이 없습니다. –

+0

@ElliottFrisch 흠, 숙제를위한 특별한 요구 사항이기 때문에 그것을 할 방법이 있다고 가정했습니다. 고마워 – 3802400

+0

이 멀티 스레드 응용 프로그램입니까? 네 차례 야 언제 어떻게 알 수 있니? –

답변

0

Scanner을 비활성화하고 다시 활성화하는 방법은 없습니다. 여기에 몇 가지 제안은 다음과 같습니다

는 수동과 같이 플레이어의 턴 ((내가 생각하는) 당신이 해왔) 전에 Scanner을 비울 수 :

while(in.hasNext()) in.next(); 

을 또는 당신이에 스캐너를 닫을 수 있습니다 플레이어의 턴의 끝은 (당신이 폐쇄 Scanner를 다시 열 수 없습니다) 다음 턴의 시작 부분에 새 인스턴스를 : 당신은에 액세스하려고하면

//Player's turn 
// 
//End of player's turn... 
in.close(); 

//Beginning of player's turn 
in = new Scanner(System.in); 

이, 그러나, IllegalStateException가 발생합니다 Scanner이 닫힌 후에 이를 해결하려면 Java 7 이상에서 리소스 사용 시도 블록을 시도하십시오.

//Overridden close method because you don't want to close System.in 
try (Scanner in = new Scanner(new InputStreamReader(System.in) 
    {public void close() throws IOException {}})) { 
    System.out.println("Enter your move:"); 
    String input = in.nextLine(); 
} 
//End of player's turn 
//Scanner is automatically closed and this code is out of the scanner's scope 

이 마지막 옵션이 최선의 방법이라고 생각합니다. Scanner의 범위를 관련 코드로 제한하고 인스턴스화/닫기를 자동화합니다. 또한 (상대적으로) 최근 자바 기능을 사용하므로 문제 해결에 필요한 대답 일 수 있습니다.

+0

첫 번째 제안은 처음 시도한 것이므로 내 프로그램이 멈추는 원인이됩니다. try 블록은 스캐너를 처음 사용할 때 in.nextLine()을 호출 할 때 "java.util.NoSuchElementException : No line found"를 제공합니다. – 3802400

+0

이 기본 코드 만 사용하면 잘 작동합니다. 예외가 발생하면 'while (in.hasNextLine())'블록에서 문제가되는 행을 감싸십시오. 다른 스레드에서 코드를 실행하고 있습니까? 'nextLine()'이 블로킹 호출이기 때문에 다음 코드를 입력하기 전에 다른 코드를 읽을 수 있다는 것은 놀라운 일입니다. – MikaelF

+0

나쁘다, System.in은 try-with-resources에서 잘 재생되지 않는다. 내 대답을 업데이트 할 시간을주세요. – MikaelF