Ineffizienter Datenstrom von URLConnection

bookon

Grünschnabel
Hallo,

ich benutze folgende unten stehende Codezeilen um XML Daten per http von einem Server zu holen.
Ich hatte schon versucht den InputStreamReader durch einen br = BufferedReader(isr) zu schleusen und dann die Daten zumindest Zeilenweise mit br.readline() zu lesen. Aber dabei bricht der Datenstrom für mich unerklärlich schon beim ersten readline() ab.

Der Verzicht auf den Buffer läßt das Codestück funktionieren, aber jetzt ist es super langsam, weil ich z.B. bei 18kByte Daten etwas mehr als 18.000 Stringoperationen durchführe.

URLConnection con = titurl.openConnection();
InputStream is = con.getInputStream();
InputStreamReader isr = new InputStreamReader(is);

String regionsList = "";
int b = 0;
while( b > -1 ) {
b = isr.read();
// TODO durch was effizienteres ersetzen!
regionsList += (char) b;
}

Und jetzt die Frage(n):
a) Was kann ich tun damit ich herausfinde warum der BufferedReader es nicht tut?
b) Gibt es eine intelligentere Methode als +=(char) b? Ich hatte schon gelesen das das schlecht ist und man besser regionsList.concat("blabla") benutzen sollte, aber das geht nur für Strings. Und 18.000 mal ausgeführt klingt für mich einfach nicht besser.

Danke für Eure Hilfe,

Jürgen Hoffmann
 
Hallo!

Schau mal hier:
Java:
/**
 * 
 */
package de.tutorials;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.URL;

/**
 * @author daritho
 * 
 */
public class DocumentFetcher {
    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        URL url = new URL(
                "http://www.tutorials.de/forum/java/240738-ineffizienter-datenstrom-von-urlconnection.html");

        long time = -System.currentTimeMillis();
        textBasedExample(url);
        System.out.println("Took: " + (System.currentTimeMillis() + time)
                + "ms");
        System.out.println("##################");
        time = -System.currentTimeMillis();
        binaryExample(url);
        System.out.println("Took: " + (System.currentTimeMillis() + time)
                + "ms");
    }

    private static void binaryExample(URL url) throws IOException {
        InputStream inputStream = url.openStream();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int bytesRead;

        while ((bytesRead = inputStream.read(buffer)) > 0) {
            baos.write(buffer, 0, bytesRead);
        }
        inputStream.close();
        //Entsprechendes Encoding angeben...
        System.out.println(new String(baos.toByteArray(), "UTF-8"));

    }

    static void textBasedExample(URL url) throws IOException {
        InputStream inputStream = url.openStream();
        BufferedReader bufferedReader = new BufferedReader(
                new InputStreamReader(inputStream));
        StringWriter stringWriter = new StringWriter();
        PrintWriter printWriter = new PrintWriter(stringWriter);
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            printWriter.println(line);
        }

        bufferedReader.close();
        printWriter.close();

        System.out.println(stringWriter.toString());
    }
}

Gruss Tom
 
Hallo Thomas,

sehr beeindruckend!
Bei mir kommen für die TextVariante 1250ms raus und die BinärVariante dauert 781ms.
Jetzt weiß ich was zu tun ist.

Danke für Deine Hilfe.

Jürgen Hoffmann
 
Zurück