2012-10-30 104 views
0

開流,直到結束我從Apache的遠程登錄client.Every時間得到一個輸入流我將命令發送給Telnet客戶端寫入終端輸出回的InputStream,但流保持打開,直到telnet會話。閱讀在Java

現在我想要一種方法來讀取這個流上的數據直到結束。問題是結束無法確定,因爲流始終打開。我發現的一種解決方法是讀取數據,直到遇到特定字符這在大多數情況下都是及時的)。但是提示符會根據命令不斷變化,我無法知道命令執行後會發生什麼。

關於被如此類似的問題這也說明它更好,但沒有人回答:

Problems with InputStream

請幫助...

+0

如果流保持打開狀態,你說的「完全」是什麼意思?您希望如何檢測讀取所有內容的差異,並在5秒內提供另一個字節? –

+0

唯一的「真正的」到底有,就是當InputStream獲取關閉導致'read()方法返回''-1'。其他一切都是協議特定的。 ? – Neet

+0

@JonSkeet以「結束」我的意思是,直到數據是找到這個availbale.any方式有可用()的方法,但這是不可靠的,CPU密集型太 – vishesh

回答

-1

最後我沒有使用timeout.So基本上,我這樣做,如果字符不可用1秒,然後放棄。 inputStream.read()我用過這個:

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」,並愉快地生活everefter :)

+0

感謝您的幫助。鏈接問題的答案建議不要使用available()方法。它只是一個答案 - 爲什麼OP面臨問題,而不是解決方法。 – vishesh

+1

它實際上建議不要在線程的循環中使用它。因爲這會將CPU驅動到100%負載。 'read'方法塊,所以沒有垃圾郵件的危險。 – Fildor