URLConnection - Es wurmt mich :-/

HarpGoil

Mitglied
Hallo liebe Community,

seit etwa drei Stunden versuche ich heraus zu finden, warum ich über eine URL-Connection nur dann den kompletten Text einer Webseite auslesen kann, wenn ich readLine-Funktionen z.B. aus BufferedReader oder DataInputStream benutze. Und selbst über so Primitive wie:
Java:
buffer_start = in.read(bbuffer,buffer_start,buffer.length - buffer_start);
bekomme ich nicht alle Bytes (1 Zeichen = 1 Byte) der Webseite. Da kann ich den byte-buffer bis ins unendliche dehnen.

Was dagegen seltsamer weise funktioniert ist:

Java:
br = new BufferedReader(new InputStreamReader(url_connection.getInputStream())); for(;;)br.readLine()
und Gleiches mit DataInputStream.

Und folgendes zerhaut irgendwie Stellenweise den Text, vermutlich weil 1 Byte doch nicht ein Zeichen ist.
Java:
dis = new DataInputStream(url_connection.getInputStream());
while((dis.read(bbuffer)) != -1) new String(bbuffer);


Kann mir jemand sagen, wie die Byte-Ausgabe kodiert ist oder welchen Reader bzw. Zeichensatz ich darauf anwenden muss?


Gruß,
Nic*
 

HarpGoil

Mitglied
Ja, das kenne ich und alles was da steht stimmt und funktioniert ganz wunderbar. Mein Problem löst es leider nicht.

Was ich heute in der BeanShell durchgespielt habe, hat mir aber einen guten Hinweis gegeben. Denn Netzwerk-Streams verhalten sich anders als Datei-Streams - sie sind wesentlich asynchroner. Da kann man mehrfach hintereinander 0 Bytes in den Buffer lesen und dann irgendwann (ODER AUCH NICHT) den Buffer stückweise oder voll beschrieben zurück bekommen. Man muss wirklich in der Schleife oder dem Thread warten, bis wieder Stream-Daten verfügbar sind. Und wenn es kein "-1"-Return von Read gibt, muss man die Verbindung eben nochmal herstellen. Widerum ein Problem: Verschiedene Verbindungsarten (HTTPS,FTP) können sich dahingehend recht renitent verhalten und nach x Versuchen einen einfach komplett blockieren.

Doof, wenn man einen "Lese von irgendeiner Quelle"-Block schreiben möchte.

Wäre schön, wenn's da schon was Gutes gäbe.


Danke,
Nic*
 

Joew0815

Bekanntes Mitglied
Ich weiß grad nicht wirklich wo dein Problem ist, Code um aus einem Netzwerkstream oder einer Datei zu lesen sieht eigentlich immer gleich aus. Zeig mal deinen Code. Das hier sieht auf jeden fall schonmal ziemlich sinnlos aus:
buffer_start = in.read(bbuffer,buffer_start,buffer.length - buffer_start);
 

HarpGoil

Mitglied
Hi Joe.
Sinnlos ist das nicht - nur eben sehr einfach. ;-)

Mein Problem ist einfach, dass ich kein einheitliches Verhalten für Verbindungstypen schreiben kann. Was Fertiges wäre schön, das Verbindungen neu aufbaut, wenn sie mitten im Stream abgebrochen sind, so dass ich mich nicht innerhalb von Schreib- oder Lesevorgängen um die Verbindung kümmern muss.

Ich möchte eine Routine auf verschiedene Protokolle und Verbindungstypen anwenden können: Datei - FTP - HTTP - HTTPS..
 

Ähnliche Java Themen

Neue Themen


Oben