Gibt es einen Grund, BufferedReader anstelle von InputStreamReader zu verwenden, wenn alle Zeichen gelesen werden?

StackOverflow https://stackoverflow.com/questions/31380

Frage

Ich verwende derzeit die folgende Funktion, um einen einfachen HTTP-GET durchzuführen.

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 BufferedReader da ich einfach alles der Reihe nach herunterladen werde.Liege ich richtig, wenn ich denke, dass es keinen Nutzen dafür gibt? BufferedReader in diesem Fall?

War es hilfreich?

Lösung

In diesem Fall würde ich das Gleiche tun wie Sie (ein Byte-Array zum Puffern verwenden und nicht einen der Stream-Puffer).

Es gibt jedoch Ausnahmen.Eine Stelle, an der Sie Puffer sehen (diesmal Ausgabe), ist die Servlet-API.Die Daten werden erst in den zugrunde liegenden Stream geschrieben spülen() wird aufgerufen und ermöglicht es Ihnen, die Ausgabe zu puffern, den Puffer dann aber zu entleeren, wenn ein Fehler auftritt, und stattdessen eine Fehlerseite zu schreiben.Sie können die Eingabe puffern, wenn Sie den Stream zum erneuten Lesen mit zurücksetzen müssen mark(int) Und zurücksetzen().Beispielsweise prüfen Sie möglicherweise den Dateiheader, bevor Sie entscheiden, an welchen Inhaltshandler der Stream übergeben werden soll.

Hat nichts damit zu tun, aber ich denke, Sie sollten Ihr Stream-Handling neu schreiben.Dieses Muster funktioniert am besten, um 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 öffnen, verschachteln Sie try/finally-Blöcke.

Ihr Code geht außerdem davon aus, dass der zurückgegebene Inhalt im Standardzeichensatz Ihrer VM codiert ist (obwohl dies je nach Anwendungsfall ausreichend sein kann).

Andere Tipps

Sie haben Recht, wenn Sie BufferedReader zum Lesen von HTTP-Inhalten und -Headern verwenden, benötigen Sie InputStreamReader, damit Sie Byte für Byte lesen können.

BufferedReader macht in diesem Szenario manchmal seltsame Dinge...besonders, wenn es um das Lesen von HTTP-POST-Headern geht, werden Sie manchmal nicht in der Lage sein, die POST-Daten zu lesen, wenn Sie den InputStreamReader verwenden, können Sie die Inhaltslänge lesen und so viele Bytes lesen. .

Jeder Aufruf eines von einem InputStreamReaderDie read()-Methoden von können dazu führen, dass ein oder mehrere Bytes aus dem zugrunde liegenden Byte-Eingabestream gelesen werden.Um die effiziente Konvertierung von Bytes in Zeichen zu ermöglichen, können mehr Bytes aus dem zugrunde liegenden Stream vorgelesen werden, als zur Erfüllung des aktuellen Lesevorgangs erforderlich sind.

Mein Bauchgefühl sagt mir, dass es überflüssig ist, den BufferedReader zu verwenden, da Sie die Pufferung bereits mithilfe des Byte-Arrays durchführen.

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