Objekte in externer Datei schreiben

Ich denke es geht um das Programm, das ich dir korrigiert hab. Wenn ja, dann musst du nix dolles machen, eigentlich nur in der Klasse Form etwas hinzufügen:
Java:
import java.io.Serializeable;

public class Form implements Serializeable {
// ...
}
 
Hab ich bereits
Die Speichern-Methode funktioniert jetzt auch nur beim Laden hab ich da noch ne Frage. Ich habe die Laden-Methode bereits so geschrieben:

public void laden(){
try{
FileInputStream file = new FileInputStream("C:Users/Max/Desktop/test.erm");
ObjectInputStream ois = new ObjectInputStream(file);

formen.add(ois.readObject());




}
catch(Exception ex){
JOptionPane.showMessageDialog(null, "Laden fehlgeschlagen!");
System.out.print(ex);
}
}

Da sagt er mir aber, dass das ganze nicht anwendbar ist, da er eine Form brauch und kein Objekt.
Mein anderes Problem ist, wenn ich jetzt jemandem die Datei schicke weiß er ja nicht wieviele Objekte hier gezeichnet werden sollen, bzw. wieviele in der Datei gespeichert sind. Wie arbeite ich alle Objekte ab ohne zu wissen wieviele es sind. Vllt. mit ner while-Schleife?
 
Beim lesen der Objekte wird ein Object zurückgegeben, das musst du dann eben noch entsprechend casten, ist aber keine dolle Sache. Und das mit der Anzahl der Objekte ist auch kein Ding. Wenn die Datei zuende ist, dann gibt readObject() null zurück, also einfach darauf prüfen und solange nicht null zurückgegeben wird, weiterarbeiten ^^

Hier mal der Code:
Java:
public void laden() {
	ObjectInputStream ois = null;
	try {
		ois = new ObjectInputStream(new FileInputStream(
				"C:/Users/Max/Desktop/test.erm"));
	} catch(FileNotFoundException e1) {
		e1.printStackTrace();
	} catch(IOException e1) {
		e1.printStackTrace();
	}
	if(ois == null) { return; }
	try {
		Object obj = null;
		while((obj = ois.readObject()) != null) {
			formen.add((Form)obj);
		}
		repaint();
	} catch(EOFException e) {
		// Datei am Ende
	} catch(Exception ex) {
		JOptionPane.showMessageDialog(null, "Laden fehlgeschlagen!");
		ex.printStackTrace();
	} finally {
		ois.close();
	}
}

Ich glaub mit dir werden wir noch ne längere Zeit zu tun haben ^^

EDIT: Hab mich mit der Rückgabe und null vertan, damit findet man nicht heraus, ob die Datei am Ende ist. Aber es wird eine EOFException geworfen, die kann man abfangen ^^ Code geändert ...
 
Zuletzt bearbeitet:
Hatte es bisher so:

Code:
public void laden(){
		try{
			FileInputStream file = new FileInputStream("C:/Users/Max/Desktop/test.erm");
			ObjectInputStream ois = new ObjectInputStream(file);
			
			
			formen.add((Form) ois.readObject());
			ois.close();
			
			this.repaint();
			
		}
		catch(Exception ex){
			JOptionPane.showMessageDialog(null, "Laden fehlgeschlagen!");
			System.out.print(ex);
		}
	}


Beim Auführen bringt er mir ne "Java heap space" Fehlermeldung java.util.OutOfMemoryError
 
Zuletzt bearbeitet:
beduetet nichts anderes als das dein HEAP vollgelaufen ist
oder mal ausführlicher
wenn du java startest *egal ob es automatisch gestartet wird durch den browser weil er n applet laden soll oder direkt als applikation* erhält es ein stück vom RAM ...
wie viel java bekommt ist teilweise festgelegt ... werden keine zusätzlichen parameter übergeben wird es mit *und jetzt korrigiert mich bitte ich weis es nicht mehr genau* mit 40MB/42MB oder 64MB verwendbarem RAM gestartet *wie gesagt ich weis es jetzt nicht genau wie viel aber ich meine es war eine dieser drei zahlen*
das beutet das du maximal soviele daten gleichzeitig im RAM halten kannst ... und wenn du mehr laden willst wird diese exception geworfen *in der regel wird dann erstmal der GC ausgeführt und wenn auch das nichts hilft schießt sich java meist ab *ist zum. bei mir so mit GUI's die dann einfrieren weil kein RAM zur verarbeitung bereit steht*
nun kannst du aber java als parameter übergeben wie viel RAM beim start schon gleich reserviert werden soll und wie viel java maximal haben darf
das geschiet mit
Code:
java -Xms= -Xmx=
mit -Xms bestimmts du wie viel ram zum start reserviert wird ... mit -Xmx wie viel maximal beansprucht werden darf
*bei multi-threaded und stacked programmierung kann auch noch -Xss sinnvoll werden um die größe der stacks festzulegen*

grund für heap-overflow
du lädts zu viele / zu große objekte gleichzeitig in den RAM
du solltest vllt bei deinem programm so vorgehen das du nicht alle objekte in einem arrays hältst sondern vom gezeichneten einen screenshot machst und nur diesen speicherst
natürlich haben beide varianten ihre vor und nachteile ... aber ich denke für ein einfaches "malprogramm" sollte die variante mit dem screenshot die bessere sein
wenn du wirklich an deinem object-chaos festhalten willst musst du entweder die heap-größen erhöhen *was sich nicht wirklich elegant macht da sonst alle die es verwenden diesen schritt tun müssen* oder nach einer möglichkeit suchen deinen heap nicht ganz so vollzukrachen ...
 
Warum fliegt keine CastException? Du serialisierst doch die List und castest es bei der Deserialisierung in einer Form.
 
Zurück