Gibt es einen Grund BufferedReader über Input zu verwenden, wenn alle Zeichen zu lesen?

stimmen
5

Ich verwende derzeit die folgende Funktion ein einfachen HTTP GET zu tun.

public static String download(String url) throws java.io.IOException {
    java.io.InputStream s = null;
    java.io.InputStreamReader r = null;
    //java.io.BufferedReader b = null;
    StringBuilder content = new StringBuilder();
    try {
        s = (java.io.InputStream)new URL(url).getContent();

        r = new java.io.InputStreamReader(s);
        //b = new java.io.BufferedReader(r);

        char[] buffer = new char[4*1024];
        int n = 0;
        while (n >= 0) {
            n = r.read(buffer, 0, buffer.length);
            if (n > 0) {
                content.append(buffer, 0, n);
            }
        }
    }
    finally {
        //if (b != null) b.close();
        if (r != null) r.close();
        if (s != null) s.close();
    }
    return content.toString();
}

Ich sehe keinen Grund , das zu verwenden , BufferedReaderda ich werde einfach alles nacheinander herunterladen. Bin ich richtig in der Annahme , keine Verwendung für die es BufferedReaderin diesem Fall?

Veröffentlicht am 28/08/2008 um 01:07
quelle vom benutzer
In anderen Sprachen...                            


4 antworten

stimmen
4

In diesem Fall würde ich tun, wie Sie tun (ein Byte-Array für die Pufferung verwenden und nicht einen der Strompuffer).

Es gibt Ausnahmen. Ein Ort , den Sie sehen Puffer (Ausgang dieses Mal) in dem Servlet - API. Die Daten werden nicht an den zugrunde liegenden Stream bis zum schriftlichen flush () aufgerufen wird , so dass Sie Ausgabe puffern , aber dann den Puffer entleeren , wenn ein Fehler auftritt und stattdessen eine Fehlerseite schreiben. Sie könnten Eingangspuffer , wenn Sie den Strom zum Zurücksetzen benötigt für rereading mit Zeichen (int) und reset () . Zum Beispiel, vielleicht würden Sie die Datei - Header überprüfen , bevor die Entscheidung über dem Content - Handler den Stream zu übergeben.

Nicht verwandte, aber ich denke, Sie Ihren Stream Handling umschreiben soll. Dieses Muster funktioniert am besten Ressourcenlecks zu vermeiden:

    InputStream stream = new FileInputStream("in");
    try { //no operations between open stream and try block
        //work
    } finally { //do nothing but close this one stream in the finally
        stream.close();
    }

Wenn Sie mehrere Streams, Nest try / finally Blöcke öffnen.

Ein andere Sache, Ihr Code macht, ist die Annahme, dass die zurückgegebene Inhalte in Ihrem VM-Standardzeichensatz codiert ist (obwohl das ausreichend sein könnte, je nach Anwendungsfall).

Beantwortet am 28/08/2008 um 16:03
quelle vom benutzer

stimmen
1

Jeder Aufruf von einem von einem Input ‚s Read () -Methoden eine Ursache oder mehr Bytes aus dem zugrunde liegenden Byte-Eingabedatenstrom gelesen werden. Um die effiziente Umwandlung von Bytes , um Zeichen zu ermöglichen, können mehr Bytes voraus aus dem zugrunde liegenden Stream gelesen werden , als notwendig sind , um die aktuelle Leseoperation zu erfüllen.

Beantwortet am 18/01/2010 um 18:11
quelle vom benutzer

stimmen
1

Sie sind richtig, wenn Sie BufferedReader zum Lesen von HTTP-Content und Header verwenden Sie Input wollen, so dass Sie Byte für Byte gelesen werden kann.

BufferedReader in diesem Szenario manchmal seltsame Dinge tut ... escpecially, wenn es darum geht, HTTP POST-Header zu lesen, manchmal werden Sie nicht in der Lage sein, die POST-Daten zu lesen, wenn Sie die Input verwenden, können Sie den Inhalt Länge gelesen und dass viele Bytes lesen .. .

Beantwortet am 28/08/2008 um 01:16
quelle vom benutzer

stimmen
0

Mein Bauch sagt mir, dass da Sie bereits Pufferung durchführen, indem das Byte-Array verwenden, ist es überflüssig ist die BufferedReader zu verwenden.

Beantwortet am 28/08/2008 um 01:18
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more