2017-02-25 4 views
0

이것은 간단한 문제처럼 보입니다. 그러나 해결할 수없는 것 같습니다. 사용자가 아무 키나 누를 때까지 변수 (출력)를 콘솔에 인쇄해야합니다. 인쇄 같은 while 루프로 수행됩니다키를 누를 때까지 출력 인쇄

int i; 
while((i=input.read())!=-1){ 
    System.out.print((char)i); 
} 
input.close(); 

문제는 입력 스트림은 결코 더 문자를 따라서 실행에서 더 이상 코드를 차단에 와서 만 대기, 종말에 도달 없다는 것입니다. 사용자에게 출력을 중단해야하는 것은 매우 분명하므로 사용자에게 그 책임을 맡기는 것이 좋습니다. 사용자가 애플리케이션을 멈추게하는 방법은 중요합니다 (예 : 스페이스 키를 누르거나 입력하거나 다른 특정 키가 괜찮은 경우). 사전에

감사합니다,
vikarjramun

답변

1

내가 콘솔 입력을 스레딩 된 해낸 최초의 솔루션입니다. 스레드는 인쇄 코드가 액세스 할 수있는 변수를 업데이트하므로 각 인쇄 문 앞에이를 확인할 수 있습니다.

import java.util.Scanner; 
import java.util.concurrent.atomic.AtomicBoolean; 

public class RunUntilKeyPressed { 
    static AtomicBoolean hasUserPressedKey = new AtomicBoolean(false); 

    public static void main(String[] args) { 

     Thread t = new Thread(() -> { 
      Scanner scan = new Scanner(System.in); 
      System.out.println(scan.next()); 
      hasUserPressedKey.set(true); 
      scan.close(); 
     }); 
     t.start(); 

     while(!hasUserPressedKey.get()) { 
      System.out.println(hasUserPressedKey); 
     } 
    } 
} 

이 코드는 사용자가 (공백 제외) 키를 누를 때까지 실행하고 scan.next() 방법은 입력을 취득하는 때 그대로 입력합니다.

+0

hasUserPressedKey를 volatile로 처리하지 않거나 일반 부울 – SergGr

+0

@SergGr 좋은 점 대신 AtomicBoolean을 사용하지 않으면이 코드가 제대로 작동하지 않을 수 있습니다. 나는 변화를 만들 것이다 – Chris

+0

고마워, 내가 이것을 시도 할 것이다 – vikarjramun

관련 문제