2013-03-19 3 views
5

Gibt es eine Möglichkeit BufferedReader.readLine() nicht hängen zu machen?Wie können Sie BufferedReader.readLine() hängen nicht?

Ich erstelle einen Server, auf:

  • Prüft, ob der Kunde eine Eingabe geliefert hat.
  • Wenn nicht, führt er einen anderen Code und schließlich eine Schleife zurück den Client für die Eingabe zu überprüfen.

Wie kann ich überprüfen, ob der Client jede Eingabe ohne Lauf readLine() geliefert hat? Wenn ich readLine() ausführen, wird der Thread hängen, bis die Eingabe geliefert wird?

+2

Warum? Wenn Sie blockierende E/A verwenden, sollte der Server über einen separaten Lese-Thread pro Client verfügen. – EJP

+0

Ich möchte nicht für jeden Benutzer zwei Threads erstellen müssen. Ich habe bereits einen Thread für jeden Benutzer. – Cin316

+1

Dies ist die traurige Realität der Java I/O-Bibliothek. Sie können entweder 1) Spin separate Threads zum Lesen 2) Verwenden Sie die NIO-Bibliothek 3) Verwenden Sie nicht readLine() und machen Sie Ihre eigenen Pufferung und Zeilenende-Management selbst – creechy

Antwort

8

können Sie BufferedReader.ready() verwenden, wie folgt aus:

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()true zurück, wenn die Quelle des Eingangs nichts in den Strom gesetzt hat, die nicht gelesen wurde.

Edit: Nur eine Notiz, bereit werden true zurückkehren, wenn auch nur ein Zeichen vorhanden ist. Sie können read() verwenden um zu überprüfen, ob es ein Zeilenvorschub oder Wagenrücklauf ist, und diejenigen, die ein Ende der Zeile anzeigen würden.

Für weitere Informationen: http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#ready()

+7

Garantiert nicht das Der nächste Aufruf von 'read()' blockiert nicht? Der Link sagt nichts über 'readLine()'. – Keppil

+2

Auch wenn es fertig ist, bedeutet das nur, dass es mindestens ein Byte gibt, nicht unbedingt eine ganze Zeile. Dies wird nicht unbedingt in allen Fällen funktionieren, obwohl Sie vielleicht Glück haben und es wird für das funktionieren, was Sie tun. – TofuBeer