2010-11-23 4 views
2

System.in에서 문자를 사용할 수있는 경우 우아한 방법으로 이벤트를 발생시킬 수 있습니까? 나는 InputStream.available()이라는 투표를 피하고 싶습니다.stdin을 비동기 적으로 읽는 방법?

+0

System.in은 줄 바꿈 형식이므로 한 번에 하나의 키 입력을 읽을 수 없습니다. 인터페이스 응용 프로그램이 필요하면 GUI가 있어야합니다. –

답변

3

사용할 수있을 때까지 읽음으로 블록하는 별도의 스레드를 만들어야합니다.

실제로 입력을 먹고 싶지 않은 경우 내부 버퍼로 래핑하고 버퍼로 읽은 다음 큰 소리로 외쳐야하며 입력을 요청하면 버퍼에서 데이터를 돌려 주어야합니다.

당신은 이런 식으로 해결할 수 :

+0

강력한 답변, 감사합니다. –

2

확실히 ... 입력에서 차단 된 스레드를 시작한 다음 무언가를 얻으면 이벤트 메서드를 호출합니다.

0
new Thread(){ 

    public void run() { 
     while(System.in.get()){ 
    } 

}.start(); 
0

매우 일반적으로

InputStream stdin = System.in; 

// Create a wrapper (with it's own dedicated read-thread) 
MyListenableInputStream listenableInputStream = 
     new MyListenableInputStream(stdin); 

// Update System.in with something more useful. 
System.setIn(listenableInputStream); 
: 이미 이벤트 반응기 실행이있는 경우

는 스레드를 생성하고 read()에 차단할 수 있습니다. 사용 가능한 데이터가있을 때 해당 스레드가 처리 할 원자로에 대한 이벤트를 대기열에 넣도록하십시오. 이 작업을 수행 할 수없는 경우 대부분의 이벤트 리액터는 InvokeLater 또는 CallLater 메서드를 제공하므로 이벤트 처리 스레드에서 일부 코드를 실행할 수 있습니다.

함수 호출을 알리거나 예약 한 후에는 read()에서 차단으로 돌아갑니다.

0

우아한 것을 원하면 Listener을 허용하는 ObservableInputStream을 쉽게 구현할 수 있지만 데이터 가용성에 대해 경고를 받으면 주기적으로 데이터를 확인하고 경우에 따라 수신기를 호출해야합니다.

작은 패킷을 보내는 개체로 스트림을 사용하지 않아도되지만 연속적인 바이트 스트림을 사용한다고 가정하면 입력 스트림에 지정된 데이터가 효과적으로 너무 자주 도착합니다 (그렇지 않으면 청취자를 자유롭게 부르는 것입니다). 또한 일관성에 대해 신경 써야합니다. 이미 데이터를 사용할 수 있고 리스너에게 경고 메시지가 표시되면 모든 바이트를 가져올 수 있습니다 (임시 버퍼에 저장해야 함). 방금 도착한 데이터가 더 많은 경우 처리 방법을 결정하십시오 (버퍼와 함께 제공하고 버퍼에 놓고 청취자를 다시 배치하는 등)

관련 문제