2012-10-30 4 views
0

아파치의 텔넷 클라이언트로부터 입력 스트림을 받고 있습니다. 텔넷 클라이언트에 명령을 보낼 때마다 터미널 출력을 다시 InputStream에 기록하지만이 스트림은 텔넷 세션까지 열려 있습니다.자바에서 끝까지 열린 스트림을 읽습니다.

이제 끝까지이 스트림의 데이터를 읽는 방법을 원합니다. 스트림이 항상 열려 있기 때문에 문제가 끝날지 결정할 수 없습니다. 특정 문자가 발견 될 때까지 데이터를 읽지 않았습니다. 이는 대부분의 경우 프롬프트입니다.)하지만 프롬프트는 명령에 따라 계속 변경되며 명령 실행 후 무엇이 될지 알 길이 없습니다.

더 잘 설명 SO에 비슷한 질문이있다지만 아무 대답이 없다 :

Problems with InputStream

도와주세요 ...

+0

: inputStream.read의() 나는이 사용? 모든 것을 읽는 것과 5 초 만에 다른 바이트를 사용할 수 있다는 차이점을 어떻게 예상합니까? –

+0

유일한 '진짜'끝은 InputStream이 닫히면'read()'가'-1'을 반환합니다. 다른 모든 것은 프로토콜에 따라 다릅니다. – Neet

+0

@JonSkeet "끝"내 말은 데이터가 availbale.any 방법을 찾을 때까지 사용할 수있는 방법입니다(),하지만 너무 안정적이고 CPU가 집중적이지 않다 – vishesh

답변

-1

마침내 나는 timeout을 사용했다. 기본적으로 1 초 동안 문자를 사용할 수 없으면 포기했다. 스트림이 열려있는 경우, 어떤 * 정확히 * 당신은 "말"에 의해 의미합니까

private char readChar(final InputStream in){ 
     ExecutorService executor = Executors.newFixedThreadPool(1); 
     //set the executor thread working 
     Callable<Integer> task = new Callable<Integer>() { 
      public Integer call() { 
       try { 
        return in.read(); 
       } catch (Exception e) { 
        //do nothing 
       } 
       return null; 
      } 
     }; 

     Future<Integer> future = executor.submit(task); 
     Integer result =null; 
     try { 
       result= future.get(1, TimeUnit.SECONDS); //timeout of 1 sec 
      } catch (TimeoutException ex) { 
       //do nothing 
      } catch (InterruptedException e) { 
      // handle the interrupts 
      } catch (ExecutionException e) { 
      // handle other exceptions 
      } finally { 
       future.cancel(false); 
       executor.shutdownNow(); 
      } 

     if(result==null) 
      return (char) -1; 
     return (char) result.intValue(); 
    } 
+0

이 모든 것들이 필요하지는 않습니다. 'Socket.setSoTimeout()'을 호출하고 결과로 나오는'SocketTimeoutException'을 처리하면됩니다. – EJP

0

당신은 독서를위한 별도의 스레드를 생성해야합니다. 당신은 당신이 직면 한 정확한 이유를 위해 하나의 실에 "핑퐁"방식으로 갈 수는 없습니다.

덧붙여서 : 지금까지 링크 한 질문에는 대답이 있습니다. CPU를 100 %로드하지 말고 정말 좋은 충고입니다. :)

read 메서드는 블록이기 때문에 스레드에 루프에 넣을 수 있습니다 루프를 끝내고 IOException 또는 "-1"의 스레드를 종료하고 영원히 행복하게 살자.

+0

도움을 주셔서 감사합니다. 연결된 질문의 대답은 available() 메서드를 사용하지 말 것을 제안합니다. OP가 문제를 해결하고 해결하는 방법이 아닌 이유에 대한 대답 일뿐입니다. – vishesh

+1

실제로 스레드의 루프에서 사용하지 않는 것이 좋습니다. 왜냐하면 CPU가 100 % 부하로 구동되기 때문입니다. 'read'-method는 차단되므로 CPU를 스팸 할 위험이 없습니다. – Fildor

관련 문제