PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Lange Texte in Java anzeigen


Aqualon
2003-11-07, 17:31:47
Ich habe ein Problem mit der Anzeige langer Texte in Java. Und zwar würde ich gerne eine 3MiB große txt-Datei öffnen und anzeigen lassen.

Den reinen Vorgang des Öffnens habe ich über einen BufferedReader gemacht, der den Text in einen StringBuffer einliest. Dies dauert weniger als eine Sekunde, ist also mehr als ausreichend.

Mein großes Problem ist nun die Anzeige des eingelesenen Textes. Meine bisherige Lösung ist es den StringBuffer in einen String zu konvertieren und danach mit setText() in eine JTextArea zu schreiben. Dies hat allerdings den Nachteil, dass es zum einen mehr als 6 Sekunden dauert und ausserdem den Speicherbedarf um ~50MiB nach oben treibt (auf insgesamt über 70MiB). Die Folge dessen ist, dass ich beim erneuten Laden der Datei eine OutOfMemory Exception bekomme.

Kennt jemand eine Möglichkeit wie man trotzdem große Textdateien öffnen und anzeigen kann, ohne soviel Speicher zu belegen?

Aqua

HellHorse
2003-11-07, 17:59:44
Liegt vermutlich am Stringbuffer, der ist ja auch vollständig synchronisiert. Würde mal probieren, selbst einen StringBuffer mit char[] zu machen.

Symptombekämpfung:
-Xmx128M

El Fantastico
2003-11-07, 18:05:32
Musst Du die ganze Datei auf einmal anzeigen? Sonst kannst Du die ja in kleinere Strings "zerhacken". Und neben der JTextArea bringst Du Kapitelpfeile an ;)

Oder, etwas komplizierter: Du zerteilst den String in gleichgrosse Teile und packst die Referenzen z.B. in eine ArrayList. Den String für die Textarea bastelst Du zu Beginn aus den ersten drei Segmenten zusammen. Du bringst Scrollbars an der Textarea an. Sobald der User (nahe) am Ende angekommen ist, er sich also im dritten Segment befindet, entfernst Du das erste Segment und fügst das nächste Segment am Ende an. Das vorher dritte Segment ist nun also das Mittelsegment. Den neuen String packst Du wieder mit setText() in die Textarea. Das grosse Problem ist jetzt, die Scrollbars/den Cursor wieder so zu positionieren, das der User davon nichts (nicht zuviel ;)) mitbekommt. Hab das auch noch nicht probiert, kann also nicht Einschätzen wie schlimm Flackern oder Ruckeln der Textarea wird... Aber wäre auf einen Erfahrungsbericht gespannt ;)

Aqualon
2003-11-07, 19:43:28
Original geschrieben von HellHorse
Liegt vermutlich am Stringbuffer, der ist ja auch vollständig synchronisiert. Würde mal probieren, selbst einen StringBuffer mit char[] zu machen.
Die Performanceprobleme treten ja erst auf, nachdem ich den StringBuffer schon in einen String umgewandelt habe. Dürfte also nicht wirklich daran liegen, aber danke für den Tip.

@El Fantastico: Von der Idee klingt es nichtmal schlecht, muss ich mal schauen ob und wie sich das machen lässt. Und falls ich damit Erfolg habe, poste ich es auch hier. Bei Nichterfolg melde ich mich sowieso nochmal ;)

Aqua