2013-03-19 29 views
5

Czy istnieje sposób, aby nie zawieszać się BufferedReader.readLine()?Jak sprawić, aby BufferedReader.readLine() nie zawiesił się?

tworzę serwer, który:

  • Sprawdza, czy klient wydał żadnych danych.
  • Jeśli nie, wykonuje inny kod, a następnie wraca do sprawdzania klienta pod kątem wprowadzania danych.

Jak mogę sprawdzić, czy klient dostarczył dane wejściowe bez uruchamiania readLine()? Jeśli uruchomię readLine(), wątek będzie zawieszony do momentu dostarczenia danych wejściowych?

+2

Dlaczego? Serwer powinien mieć oddzielny wątek do czytania na klienta, jeśli korzystasz z blokujących operacji we/wy. – EJP

+0

Nie chcę tworzyć dwóch wątków dla każdego użytkownika. Mam już jeden wątek dla każdego użytkownika. – Cin316

+1

To jest niefortunna rzeczywistość biblioteki I/O Java. Możesz albo 1) Zakręcić oddzielne wątki do czytania 2) Korzystać z biblioteki NIO 3) Nie używać readLine() i samodzielnie zarządzać buforowaniem i końcem linii – creechy

Odpowiedz

8

BufferedReader.ready() można używać, podobnie jak to:

BufferedReader b = new BufferedReader(); //Initialize your BufferedReader in the way you have been doing before, not like this. 

if(b.ready()){ 
    String input = b.readLine(); 
} 

ready() powróci true jeśli źródłem wejścia nie kłaść się do strumienia, który nie został odczytany.

Edytuj: Po prostu notatka, gotowa zwróci true za każdym razem, gdy obecny jest tylko jeden znak. Możesz użyć numeru read(), aby sprawdzić, czy jest wiersz lub powrót karetki, a te wskazywałyby koniec linii.

Aby uzyskać więcej informacji: http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#ready()

+7

Czy to nie gwarantuje tylko, że następne wywołanie funkcji 'read()' nie blokuje? Łącze nie mówi nic o 'readLine()'. – Keppil

+2

Nawet jeśli jest gotowy, oznacza to tylko, że istnieje co najmniej jeden bajt, niekoniecznie cała linia. To niekoniecznie będzie działać we wszystkich przypadkach, choć możesz mieć szczęście i będzie działać dla tego, co robisz. – TofuBeer

Powiązane problemy