wirklich großer Text in JTextArea => Heap Space Error

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hi!

Ich will eine wirklich große Ausgabe in eine JTextArea stecken.
Der Text ist ein generierter Text basierend auf verschiedenen USer bezogenen Faktoren und kann wirklich riesig werden.
Die Textbox dient mehr oder minder der Kontrolle und dem "aha ok es ist was da!" Effekt.

Der User soll im Anschluss durch klick auf einen "In Zwischenablage kopieren" den text in die System Zwischenablage bekommen und dann an anderer Stelle (Excel oder andere Programme) den text einfach wieder einfügen können.

Problem:
Die JTextArea schmeisst einen HeapSpace Error, der es mir nciht möglich macht solche großen Texte dort hinein zu schaufeln. In einem anderen Programm in C# ist dies aber möglich :-/

Gibt es eine alternative zur JTextArea oder eine andere Möglichkeit diese noch weiter auf zu borhen?
Meinen Text schreibe ich mit
Code:
textArea.append(myStringBuffer.toString());
in die entsprechende TextArea.
 
Du musst dein Prog mit
java -Xmx1024M -jar datei.jar
starten!

Das war aber nur ein Bsp! Also er würde hier max. 1024M reservieren (wenn er es benötigt) sofern du halt soviel hast!
 
gibts eine alternative?
könnte blöd aussehen das programm so auf einem kundenrechner zu starten der nicht soviel speicher hat ^^
 
Es wird so viel Speicher gebraucht, wie gebraucht wird, und wenn er nicht reicht, reicht er nicht. Hm.

THEORETISCH (!) KÖNNTE(!) es was bringen, den Ablauf zu ändern:

Vorher:
Code:
void doit()
{
    StringBuffer myStringBuffer = new StringBuffer();
...
    textArea.append(myStringBuffer.toString());
}
Nachher
Code:
void doit()
{
    StringBuffer myStringBuffer = new StringBuffer();
...
    String s = myStringBuffer.toString();
    myStringBuffer = null;
    textArea.append(s);
}
Als (aus den Fingern gesogene) Begründung: Wenn im StringBuffer 100 MB Stringdaten liegen, dann wird beim "toString" ein neuer String erstellt - mit wieder 100MB. Dieser String wird an die TextArea übergeben und dort reingewurstet, was nochmal 100MB braucht - es existieren sozusagen DREI mal die gleichen 100MB. Mit der obigen Methode würden zu keinem Zeitpunkt mehr als ZWEI Kopien dieser Daten existieren.
Aber vielleicht täusch' ich mich auch grad ???:L Wie auch immer: Wie die JVM intern mit dem Speicher umgeht, weiß kaum jemand so genau....
 
Hmm macht keinen wirklcih Unterschied.
Es klappt noch nicht mal den Text per STRG+V in die TextArea zu stecken - selber Fehler:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
	at javax.swing.text.GapContent.allocateArray(GapContent.java:77)
	at javax.swing.text.GapVector.resize(GapVector.java:197)
	at javax.swing.text.GapVector.shiftEnd(GapVector.java:212)
	at javax.swing.text.GapContent.shiftEnd(GapContent.java:328)
	at javax.swing.text.GapVector.open(GapVector.java:184)
	at javax.swing.text.GapVector.replace(GapVector.java:125)
	at javax.swing.text.GapContent.insertString(GapContent.java:115)
	at javax.swing.text.AbstractDocument.handleInsertString(AbstractDocument.java:709)
	at javax.swing.text.AbstractDocument.insertString(AbstractDocument.java:693)
	at javax.swing.text.PlainDocument.insertString(PlainDocument.java:114)
	at javax.swing.text.AbstractDocument.replace(AbstractDocument.java:655)
	at javax.swing.text.JTextComponent.replaceSelection(JTextComponent.java:1351)
	at javax.swing.plaf.basic.BasicTextUI$TextTransferHandler.handleReaderImport(BasicTextUI.java:2342)
	at javax.swing.plaf.basic.BasicTextUI$TextTransferHandler.importData(BasicTextUI.java:2483)
	at javax.swing.TransferHandler.importData(TransferHandler.java:745)
	at javax.swing.plaf.basic.BasicTextUI$TextTransferHandler.importData(BasicTextUI.java:2420)
	at javax.swing.TransferHandler$TransferAction.actionPerformed(TransferHandler.java:1655)
	at javax.swing.text.JTextComponent.invokeAction(JTextComponent.java:1485)
	at javax.swing.text.JTextComponent.paste(JTextComponent.java:1463)
	at javax.swing.text.DefaultEditorKit$PasteAction.actionPerformed(DefaultEditorKit.java:1337)
	at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1636)
	at javax.swing.JComponent.processKeyBinding(JComponent.java:2849)
	at javax.swing.JComponent.processKeyBindings(JComponent.java:2884)
	at javax.swing.JComponent.processKeyEvent(JComponent.java:2812)
	at java.awt.Component.processEvent(Component.java:5911)
	at java.awt.Container.processEvent(Container.java:2023)
	at java.awt.Component.dispatchEventImpl(Component.java:4501)
	at java.awt.Container.dispatchEventImpl(Container.java:2081)
	at java.awt.Component.dispatchEvent(Component.java:4331)
	at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1848)
	at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:704)
	at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:969)

Auch klappt es nicht den Text in die Zwischenablage zu schieben - auch wieder nur aus JAVA heraus :-(
Gibts noch irgendwelche Möglichkeiten?
 
Setzt du denn bisher den Speichern oder verwendest du die Standardeinstellungen?

Die einfachste Möglichkeit ist definitiv erstmal den Speicher zu erhöhen. Es müssen ja vielleicht nicht gleich 1024 MB sein aber 256 MB oder vielleicht sogar 512 MB sollten auf neueren Rechnern doch wohl an sich kein Problem darstellen.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben