Archiv verlassen und diese Seite im Standarddesign anzeigen : [Java] Wie Schnelles Ausparsen von Variablen (chars, ints, ...) aus Streams?
Grüssi!
Ich muss aus einem Stream den ich übers Netz transportiere, große Mengen von ariablen ausparsen, und mein Problem ist, dass es zwar PrintWriter gibt, die Variablen ohne Probleme schreiben können, einen PrintReader gibt es nicht.
D.h. ich müsste die einzelnen z.B. ints aus einem String ausparsen, den ich zuvor aus dem Stream erzeuge.
Dabei entsteht viel Garbage und außerdem viel Overhead.
Kennt irgendwer eine Möglichkeit, aus einem Stream z.B. Characters oder Ints oder was weiß ich sehr SCHNELL auszuparsen, egal ob ich eine externe Bibliothek benutzen muss oder Möglichkieten nutzen kann, die das JDK bietet.
Klasse wäre natürlich, wenn jemand eine schnelle Library kennt, die genau für diesen Zweck entwickelt wurde...
Wie gesagt, es muss wirklich sehr schnell gehen....
anda_skoa
24-10-2003, 09:44
Wenn du zeilenweise Daten bekommst, kannst du sehr einfach mit einem BufferedReader ganze Zeilen lesen.
Ein StringTokenizer (java.util) zerlegt dir den dann in einzelen Stücke.
Das Parsen der Teile können eh die Wrapperklassen der entsprechenen Typen, also zB für int Integer.parseInt
Ciao,
_
Hi anda_skoa!
Ja, ich weiß, so hab ich es bis jetzt auch immer gemacht, aber da entsteht enorm viel Overhead und es ist enorm langsam.
Stream -> String -> Substring -> String-Parsen
Dabei muss jeweils für String und Substring speicher angefordert und entsorgt werden :(
Ich würde was suchen, was aus Streams direkt Variablen rauslesen kann, ohne den ganzen Umwandel-Overhead.
anda_skoa
24-10-2003, 12:49
Ein textbasiertes Protokoll hat immer Overhead.
Das String lesen wirst du nicht vermeiden können, es sei denn du hast ein garantiertes Encoding das mit einem Byte pro Char auskommt, zb Latin1.
Wenn du den String selbst parsen willst, um keine Substrings zu erzeugen, dann einfach drüber iterieren.
Wenn ein Integer erwartet wird ist der ziemlich trivial zu parsen, du musst nu von jedem Zeichen das Zeichen '0' abziehen und erhälts den Nnumerischen Wert.
Pro weiter Stelle das bisherige Resultat mit 10 mutliplizieren.
Allerdings ist es IMHO ziemlich fraglich, ob der zusätzliche Aufwand bei der Implementierung und Wartung den minimalen Performance-Vorteil rechtfertig.
Ciao,
_
schon mal bei apache.org gechaut? Die haben da IMHO ein paar Klassen für Reguläre Ausrücke ... vielleicht schafft das ja abhilfe.
Wäre es nicht evtl. sinnvoll das ganze in XML zu verpacken und einen SAX-Parser darauf loszulassen, die XML APIs sind ja alle gut gepflegt.
fs111
peschmae
24-10-2003, 13:19
und mit ObjectOutputStream? Für die primitiven Datentypen gibts ja wrapper-klassen.
Dann sollte sich da doch mit ObjectInputStream und Rtti oder so was machen lassen.
MfG Peschmä
So wies aussieht werd ich mir wohl selbst einen Parser implementieren müssen :(
Das Problem mit Sax-Parsern und XML ist, dass ich wieder sehr viel Netzwerkoverhead habe, was auch nicht sein darf. Außerdem sind zwar die Parser schnell, aber das herauskitzeln der Werte genau wieder so langsam, da ja alles über Events passiert :(
anda_skoa
24-10-2003, 14:33
Original geschrieben von peschmae
und mit ObjectOutputStream? Für die primitiven Datentypen gibts ja wrapper-klassen.
Ja, das ist das einfachste, aber dann beschränkt man sich darauf, dass beide Verbindungspartner in Java implemeniert sind.
Ciao,
_
Und wenn du das gesamte irgendwie als Unicode oder ähnliches konvertierst?
MfG Walfisch
peschmae
24-10-2003, 17:04
Original geschrieben von anda_skoa
Ja, das ist das einfachste, aber dann beschränkt man sich darauf, dass beide Verbindungspartner in Java implemeniert sind.
Ich hab jedenfalls nichts anderes gelesen.
@ceisserer: Wie ist das genau?
MfG Peschmä
und mit ObjectOutputStream? Für die primitiven Datentypen gibts ja wrapper-klassen.
Ich dachte, da Ihr das mit den Wrapper-Klassen erwähnt hattet, dass man die int, bytes, etc. zuerst in Ihre Wrapper verpacken muss, da ObjectOutputStream nur Objecte und keine primitiven Datentypen handeln kann.
Jetzt hab ich mir die APIDocs angesehen, und tatächlich, da gibt genau das was ich gesucht habe: readInt(), writeIn(),....
Jetzt muss das nur noch mit der MS-JVM, Netscape-4.x (Java-1.1.5) und 1.2+ gehen, dann bin ich restlos glücklich!!
Darf man auch erfahren, was Du da genau tust?
fs111
anda_skoa
24-10-2003, 18:34
Du kannst auch DataOutputStream und DataInputStream verwenden wenn du nur primitive Typen übetragen musst.
Laut Doku "since JDK1.0", das sollte selbts die MS JVM schaffen
Ciao,
_
Danke, diese Klasse ist ja noch besser!
@fs11:
Ich programmiere gerade an meinem Maturaproject, das isn Urlaubsplaner.
Der User "blättert", prktisch nach vorne und der Client muss für ~50User, 35 Tage alle Tagesdaten runterladen, ausparsen und anzeigen.
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.