2016-01-28 81 views
0

我用Java編寫一個簡單的聊天應用程序,一切工作正常,除了以下奇怪的錯誤:BufferedReader是否阻止標準控制檯輸入?

當您在終端的東西,比如你按下「A」和控制檯寫道:「一個」,然後你按下「i」,它會寫「i」,「r」 - >「r」...,然後你就會得到在控制檯中寫的單詞(例如「空氣」)。在我的情況下,我按下「e」,控制檯寫入「(無)」,「我」 - >「(注意)」,「r」 - >(無),只有按下「進入」控制檯後突然顯示整個單詞「空氣」,以同樣的方式使用多個單詞。事實上,用戶可以寫任何他/她想要的內容,但只有在按下Enter之後,輸入的文本纔會出現。

在我的節目我用BufferedReader對象從套接字閱讀:

try(....some socket stuff.... 
     PrintWriter out = new PrintWriter(clientSocket.getOutputStream(),true);//out is the socket output 
     BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); //in is the socket input 

BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); //that's the standard input, the one from keyboard 
while(true){ 
      if (stdIn.ready()){ 
      userInput=stdIn.readLine(); 
      out.println(userInput); 
      if(userInput.equals("Bye.")) break; 
      System.out.println("Me: "+userInput); 
      } 

      if(in.ready()){ 
      if((serverInput= in.readLine())!=null){ 
       System.out.println("Stranger: "+serverInput); 
      } 

      } 

在我看來這方法 - readyreadline() - 可能錯誤控制檯。這對我來說似乎有點奇怪,但它是Java,我不是很熟練。

除此之外,聊天工作就像魅力 - 它正確地發送和接收。 read-receive-input腳本與客戶端完全相同。當你輸入一條消息時,控制檯中沒有任何東西會顯示出來,但它實際上在那裏,並且在Enter上顯示,這不是延遲,它受Enter的影響。

+0

你打電話給你的應用程序?我嘗試了一段類似的代碼,它適用於我,我猜你的環境是抑制來自終端的輸入,並且它輸入的原因是因爲'out.println(userInput);'行 – ecarlos

+0

#ecarlos 我用java ServerSide 和java ClientSide 初始化程序,然後它只是工作...服務器有它的Serversocket和一個普通的套接字使用.accept()方法。在你打字的時候,沒有什麼特別的,你只是看不到你打字的內容,這是令人討厭的部分。你能建議什麼可以「抑制」來自終端的輸入嗎? – KDX2

+0

你以某種方式將控制檯變爲無回聲模式。它與'BufferedReader'沒有任何關係。 – EJP

回答

-1

這是不可能在java中做的。 至少不是平臺獨立的方式。

你要做的是,不按回車鍵逐個字符地閱讀。 但是默認情況下,操作系統本身的控制檯處於緩衝行模式。

因此,唯一的解決方案是將您的控制檯放在原始模式(線路編輯繞過,無需輸入密鑰),使其與平臺相關。

編輯:你的描述說的是字符閱讀,而你的代碼正在做別的事情。

+0

是的,控制檯不會顯示用戶在輸入時正在鍵入的內容,它本身發生,我無法找到我的代碼爲什麼導致它。你能建議我一種方法或東西來閱讀?無論我在控制檯,命令和其他文本中寫什麼,這個問題都不會出現,只是在這個特定的情況下。也許我不是很瞭解某事,如果是這樣的話,很抱歉。 – KDX2