Frage

Ich habe folgendes Beispiel aus einem gepufferten Leser lesen:

while ((inputLine = input.readLine()) != null) {
   System.out.println("I got a message from a client: " + inputLine);
}

Der Code in der Schleife println wird (in diesem Fall input) immer dann, wenn etwas erscheint im gepufferten Leser ausgeführt werden. In meinem Fall, wenn eine Client-Anwendung etwas an die Steckdose, wird der Code in der Schleife (in der Server-Anwendung) schreibt ausgeführt wird.

Aber ich verstehe nicht, wie es funktioniert. inputLine = input.readLine() wartet, bis etwas in der gepufferten Leser erscheint und wenn etwas erscheint es gibt true und der Code in der Schleife ausgeführt wird. Aber wenn null können zurückgegeben werden.

Es ist eine andere Frage. Der obige Code wurde aus einem Verfahren genommen, den throws Exception und ich diesen Code in der run-Methode des Threads verwenden. Und wenn ich versuche throws Exception vor dem run setzen der Compiler beschwert sich: überschriebene Methode nicht Ausnahme wirft. Ohne die throws exception Ich habe eine andere beschweren sich vom Compiler: nicht gemeldete Ausnahme. Also, was kann ich tun?

War es hilfreich?

Lösung

Wenn die Buchse am anderen Ende geschlossen sind, sollte der Leser eine leere Zeichenfolge zurück. Dies ist die Bedingung, die Sie suchen. Um die Ausnahme zu behandeln, wickelt die Leseschleife in einem try / catch-Block.

 try {
   while ((inputLine = input.readLine()) != null) {
     System.out.println("I got a message from a client: " + inputLine);
   }
 }
 catch (IOException e) {
   System.err.println("Error: " + e);
 }

Sie können diese Tutorial beim Lesen / Schreiben von / an eine Steckdose in Java, hilfreich sein.

Andere Tipps

Für Ihre erste Frage:

  

Aber ich verstehe nicht, wie es funktioniert. Eingabezeile = input.readLine () wartet, bis etwas in der gepufferten Leser erscheint und wenn es etwas scheint es, gibt true zurück, und der Code in der Schleife ausgeführt wird. Aber als null zurückgegeben werden können.

BufferedReader.readLine() nicht zurück true auf Erfolg. Es gibt einen String enthält die Zeile, die gelesen wurde. Wenn das Ende des Streams erreicht wird, gibt sie null.

Ihre zweite Frage:

  

Der obige Code wurde von einem Verfahren genommen, die Ausnahme auslöst und ich verwende diesen Code in der run-Methode des Thread. Und wenn ich zu setzen versuchen throws Exception vor dem Lauf der Compiler beschwert sich: überschriebene Methode nicht Ausnahme wirft. Ohne die Ausnahme wirft Ich habe eine andere aus dem Compiler beschweren: nicht gemeldete Ausnahme. Also, was kann ich tun?

Sie sollten Ihren Code wickeln in einem try / catch-Block . Wenn Sie nicht über die abgefangene Ausnahme behandeln möchten, lassen Sie einfach den Teil leer (nicht empfohlen)

try {
    while ((inputLine = input.readLine()) != null) {
        System.out.println("I got a message from a client: " + inputLine);
    }
} catch (Exception e) {
    //handle exception
}

Die Leser readline () einen String-Wert zurück, wenn es etwas zu lesen, eine leere Zeichenfolge, wenn es noch nichts, und null, wenn die Verbindung geschlossen wird.

Ich würde empfehlen, einen try / catch um den Code-Block mit den IO-Funktion und Griff Fehlern Einwickeln in geeigneter Weise.

input Leser wird auf dem Sockel verbunden ist, der ein Hörer ist, d.h. hält, um eingehende Nachrichten zu hören.

über Ihre zweite Frage, sollten Sie einen try / catch-Block innerhalb der Methode setzen, die Ausnahme abfangen und damit umgehen. Nicht erneut werfen Sie es.

  

Aber ich verstehe nicht, wie es funktioniert. .... wartet, bis etwas in das erscheint   gepufferten Leser und wenn etwas   erscheint es es gibt true

Nein, es gibt den Wert des Ausdrucks (Eingabezeile = input.readLine ()), die Eingabezeile selbst. Die Eingabezeile ist im Vergleich zu null.

null zurückgegeben wird, wenn die "EOF (End Of File)" erreicht ist. Da dies von einem Netzwerk-Socket zu lesen, das Ende der Datei erstellt wird, wenn die Buchse (entweder vom Server oder Client) getrennt sind, aber Sie werden wahrscheinlich eine Ausnahme erhalten, bevor Sie tatsächlich die EOF sehen.

Wenn dies nicht für die Hausaufgaben ist, können Sie bei Apache Commons aussehen wollen? IOUtils .

Angenommen, Sie nicht die BufferedReader erstellen, und nur an der Input stoppen:

String results = IOUtils.toString(inputStream);
System.out.println(results);
while ((inputLine = input.readLine()) != null) {

Sehen Sie in jedem Teil des Ausdrucks:

input.readLine()

Gibt eine Zeichenfolge, die null sein wird, wenn das Ende des Stroms erreicht ist (oder löst eine Ausnahme auf Fehler).

inputLine = input.readLine()

Ordnet diese Zeichenfolge Eingabezeile

((inputLine = input.readLine()) != null)

überprüft, ob der String, der zugewiesen wurde, ist nicht null (Ende des Streams).

Sie haben einige gute Antworten erhalten. Nur fangen die Ausnahme und behandeln Sie es lokal. Wenn Sie diese auf andere Codes übergeben müssen, aber nicht kann, da die run() Methode für jede Kontroll Ausnahme nicht zulässt, können Sie die Ausnahme in einer Runtime irgendeiner Art wickeln. Wenn die run-Methode direkt auf einem Gewinde Ausführung (da es ein Runnable wahrscheinlich ist), dann sollten Sie eine gewickelte Ausnahme kümmern mit Wieder werfen.

Was das Ergebnis von readLine(), wird es null zurück, wenn es nichts mehr zu lesen. Im Fall einer Steckdose ist dies, wenn die andere Seite sauber die Buchse (eine plötzliche Beendigung oder unsauber schließt typischerweise in einer Ausnahme im Code führen würde, wie das Betriebssystem eine andere Art von Steckdose in der Nähe abschicken) geschlossen wird.

ich ein Wort der Vorsicht, da Sie eine Steckdose in einem java.io.BufferedReader wickeln. Sie sollten über die Verwendung dieses in jeder Art von Produktionscode sehr vorsichtig sein.

Die Gefahr ist, dass BufferedReader nicht gut mit Ausnahmen in der Mitte des Lesens befasst. Dies ist insbesondere dann ein Problem, wenn Sie ein Timeout auf dem Sockel aktiviert haben, so der Code periodische Ausnahmen automatisch vom Betriebssystem empfangen werden. Die Timeout (oder andere Ausnahme) kommen könnte, während die Puffer im Innern des Lesers füllen. Wenn Sie das Objekt nach der Ausnahme wieder zu verwenden versuchen, wird es alle vorherigen Inhalt in dem Puffer ignorieren. Das Paket (e), die zuvor erhalten wurden, ist geräuschlos verloren und es gibt keine Möglichkeit, dieses Bytes abgerufen werden.

Beachten Sie, dass es andere Arten von Socket-Ausnahmen, die nicht bedeuten, dass die Fassung verloren gegangen ist. Zum Beispiel sehen Sie die Definition von java.io.InterruptedIOException. Dies hat eine öffentliche Variable, die die Anzahl von Bytes, die erfolgreich in der letzten I / O (Lesen oder Schreiben) Anforderung übertragen Berichte. Dies bedeutet, dass die IO-Operation erneut ausgeführt werden kann abgerufen werden oder das verbleibenden Bytes für das Paket senden.

Wenn auf jede Ausnahme Ihr Design ist sofort nahe der Leser und die Buchse das Verfahren korrekt funktionieren.

Der richtige Weg aus der Steckdose zu lesen ist, die Steckdose Strom direkt zu nutzen, verwenden Sie NIO (ByteBuffers und so weiter), oder verwenden Sie eine gut geschriebene Netzwerk-Bibliothek mit guten Abstraktionen über diese untere Ebene Klassen (mehrere Open-Source-diejenigen zur Verfügung stehen) .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top