Zum Inhalt springen

Array Daten in Binär Datei schreiben/lesen


Empfohlene Beiträge

Geschrieben

Hallo

Versuche gerade mein Array in eine Binärdatei zu schreiben und wieder aus zulesen. Leider klappt das nicht.

Hier meine Codes:

public static void write(Datensatz Daten) {

ObjectOutputStream out = new ObjectOutputStream(new

FileOutputStream("Daten.dat"));

out.writeObject(Daten);

out.close();

}

public static Datensatz read() {

ObjectInputStream in = new ObjectInputStream(new

FileInputStream("Daten.dat"));

Datensatz [] Daten = in.readObject();

return Daten;

in.close();

}

Aufruf der Funktion nach for-Schleife:

...

Daten = new Datensatz(T1.getText(), T2.getText(), T3

.getText(), T4.getText(), T5.getText()); //Daten aus Eingabemaske

IO.write(Daten[0]);

...

Erklärung:

Daten - Arrayname

Datensatz - Klasse mit Daten wie Vorname, Nachname...

Kann wer helfen?

DANKE

Geschrieben

Moin,

kleine Bitte: benutze die Code-Tags für deinen Quelltext.

(...)

Leider klappt das nicht.

Kann wer helfen?

Wobei genau? Was klappt nicht? Ist das File leer? Kommt Murks raus? Gibt es eine Exception? Beschreib dein Problem bitte genauer.

Geschrieben

Kann zwar speichern, aber beim wieder auslesen (nach dem schliessen des Proggs) geht das Auslesen nicht mehr. Hier nochmal der überarbeitete Code:

public class IO {


	public static void write(Datensatz[] daten) throws IOException {

		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(

				"Daten.dat"));

		out.writeObject(daten);

		out.close();

	}


	public static Datensatz[] read() throws IOException, ClassNotFoundException {

		ObjectInputStream in = new ObjectInputStream(new FileInputStream(

				"Daten.dat"));

		Datensatz[] daten = (Datensatz[]) in.readObject();

		in.close();

		return daten;

	}


}
Und der Aufruf erfolgt durch foldendes Ereignis:
MouseAdapter mouse_write = new MouseAdapter() {

			public void mouseDown(MouseEvent e) {

				{

					int i = 0;


					for (i = 0; i < Daten.length; i++)

						Daten[i] = new Datensatz(T1.getText(), T2.getText(), T3

								.getText(), T4.getText(), T5.getText());


					try {

						IO.write(Daten);


					} catch (Exception ex) {

						System.out.println("Mysterious...");

					}

				}

			}

		};

Geschrieben

Was mir da eigentlich als erstes aufgefallen ist, du schreibst mehrere Objekte vom Typ "Datensatz" in eine Datei, versuchst dann aber beim Auslesen nur ein komplettes Array auszulesen..ich denke mal, das wird nicht funktionieren. Wenn dann musst du auch beim Einlesen wieder jedes einzelne Datensatz Objekt auslesen.

Und des weiteren bin ich mir nicht so sicher ob, dadurch dass du beim Schreiben jedes neuen Objektes einen neuen ObjectOutputStream erzeugst, wirklich die verschiedenen Objekte an die Datei ranhängst. Ich kann mir auch gut vorstellen, dass du jedes mal die Datei überschreibst und damit immer nur ein Object in der Datei steht.

Geschrieben

Das mit dem Überschreiben wird auch o sein, aber ich bekomme das einfach nicht hin :-( Hier nochmal die Codes:

Zum Lesen und Schreiben:

import java.io.DataOutputStream;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;


public class IO {


	public static void write(Datensatz daten[]) throws IOException {

		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(

				"Daten.dat"));

		out.writeObject(daten);

		out.close();

	}


	public static Datensatz[] read() throws IOException, ClassNotFoundException {

		ObjectInputStream in = new ObjectInputStream(new FileInputStream(

				"Daten.dat"));

		Datensatz daten []= (Datensatz[]) in.readObject();

		in.close();

		return daten;

	}


}
Klasse Datensatz:
public class Datensatz implements Serializable {

	static String Vorname, Nachname, Wohnort, Strasse, PLZ;


	public Datensatz(String Vorname, String Nachname, String Wohnort,

			String Strasse, String PLZ) {


		this.Vorname = Vorname;

		this.Nachname = Nachname;

		this.Wohnort = Wohnort;

		this.Strasse = Strasse;

		this.PLZ = PLZ;


	}


	public String getVorname() {

		return Vorname;

	}


	public String getNachname() {

		return Nachname;

	}


	public String getWohnort() {

		return Wohnort;

	}


	public String getStrasse() {

		return Strasse;

	}


	public String getPLZ() {

		return PLZ;

	}


}
Aufrufende Methoden:
		MouseAdapter mouse_write = new MouseAdapter() {

			public void mouseDown(MouseEvent e) {

				{

					int i = 0;


					for (i = 0; i < Daten.length; i++)

						Daten[i] = new Datensatz(T1.getText(), T2.getText(), T3

								.getText(), T4.getText(), T5.getText());


					try {

						IO.write(Daten);


					} catch (Exception ex) {

						System.out.println("Mysterious...");

					}

				}

			}

		};


		MouseAdapter mouse_read = new MouseAdapter() {

			public void mouseDown(MouseEvent e) {


				try {


					Datensatz Daten[] = IO.read();


					int i = 0;


					T1.setText(Daten[i].Vorname);

					T2.setText(Daten[i].Nachname);

					T3.setText(Daten[i].Wohnort);

					T4.setText(Daten[i].Strasse);

					T5.setText(Daten[i].PLZ);


				} catch (ClassNotFoundException e1) {

					System.out.println("Mysterious...");

				} catch (IOException e1) {

					System.out.println("Mysterious...");

				}

			}

		};

Geschrieben

WAS heißt denn 'klappt nicht'?

Erkläre doch mal genauer was genau nicht funktioniert. Und dass du jetzt keine Fehlermeldungen bekommst dürfte bei dem Exception-Handling klar sein....mach mal trotzdem das was kingofbrain dir schon geraten hat, lass dir, wenn eine Exception geworfen wird, den Stacktrace dazu ausgeben.

Und außerdem versuchst du noch immer in deiner read()-Methode die gesamten Daten in ein Array einzulesen, obwohl du vorher die einzelnen Objekte als Einzelnes gespeichert hat, das wird so nicht funktioniert.

Geschrieben

Also wenn ich den Quellcode oben richtig lese (Mittagstief und so :) ), dann wird auch beim Schreiben jeweils das gesamte Array serialisiert. Deshalb sollte das beim Lesen klappen. Bleibt aber trotzdem noch die Sache mit dem Exception-Logging, die fehlt.

Schöne Grüße,

Peter

Geschrieben

Hab das mit e.printStackTrace() gemacht, aber es wird kein Fehler geworfen.

Wenn ich etwas während des Laufen des Programmes speicher, gibt er dies auch wieder aus. Aber auch nur den zuletzt gespeicherten Datensatz.

Wenn das Programm wieder geöffnet wird und die Datensätze auslesen soll, geht die Shell einfach zu.

Geschrieben
Also wenn ich den Quellcode oben richtig lese (Mittagstief und so :) ), dann wird auch beim Schreiben jeweils das gesamte Array serialisiert. Deshalb sollte das beim Lesen klappen. Bleibt aber trotzdem noch die Sache mit dem Exception-Logging, die fehlt.

Schöne Grüße,

Peter

Hm hast recht, das Mittagstief hatte mich wohl auch schon erwischt, hatte total überlesen dass da jetzt auch nen Array bei er write() Methode gespeichert wird.

@Seppe123; wie startest du dein Programm denn? Weil wenn du sagst, beim nochmaligem starten des Programmes geht die Shell einfach wieder zu, steht dann vielleicht in dieser zugehenden Shell noch eine Fehlermeldung drin, die du nur nicht mehr mitbekommst?

Geschrieben

Das ganze läuft über SWT:

Hier noch der Code der Main

package own_projects;


import java.io.IOException;


import org.eclipse.swt.SWT;

import org.eclipse.swt.accessibility.*;

import org.eclipse.swt.events.KeyEvent;

import org.eclipse.swt.events.KeyListener;

import org.eclipse.swt.events.MouseAdapter;

import org.eclipse.swt.events.MouseEvent;

import org.eclipse.swt.graphics.Image;

import org.eclipse.swt.widgets.Button;

import org.eclipse.swt.widgets.Display;

import org.eclipse.swt.widgets.Event;

import org.eclipse.swt.widgets.Label;

import org.eclipse.swt.widgets.Listener;

import org.eclipse.swt.widgets.MessageBox;

import org.eclipse.swt.widgets.Shell;

import org.eclipse.swt.widgets.Text;


public class eingabefelder {


	public static void main(String[] args) {


		Display display = new Display();

		final Shell shell = new Shell(display);

		shell.setSize(500, 800);

		Image image = new Image(display, "images/MJ.png");

		shell.setImage(image);

		shell.open();


		final Datensatz[] Daten = new Datensatz[3];


		final Button B1 = new Button(shell, SWT.PUSH);

		B1.setText("Speichern");

		B1.setBounds(50, 300, 200, 50);


		final Button B2 = new Button(shell, SWT.PUSH);

		B2.setText(">>");

		B2.setBounds(250, 300, 200, 50);


		final Button B3 = new Button(shell, SWT.PUSH);

		B3.setText("Auslesen");

		B3.setBounds(50, 350, 200, 50);


		final Button B4 = new Button(shell, SWT.PUSH);

		B4.setText("Clear");

		B4.setBounds(250, 350, 200, 50);


		Label L1 = new Label(shell, SWT.NONE);

		L1.setText("Vorname:");

		L1.setBounds(50, 100, 50, 50);

		L1.pack();


		final Text T1 = new Text(shell, SWT.BORDER);

		T1.setBounds(130, 100, 50, 50);

		T1.pack();


		Label L2 = new Label(shell, SWT.NONE);

		L2.setText("Nachname:");

		L2.setBounds(50, 130, 50, 50);

		L2.pack();


		final Text T2 = new Text(shell, SWT.BORDER);

		T2.setBounds(130, 130, 50, 50);

		T2.pack();


		Label L3 = new Label(shell, SWT.NONE);

		L3.setText("Wohnort:");

		L3.setBounds(50, 160, 50, 50);

		L3.pack();


		final Text T3 = new Text(shell, SWT.BORDER);

		T3.setBounds(130, 160, 50, 50);

		T3.pack();


		Label L4 = new Label(shell, SWT.NONE);

		L4.setText("Strasse:");

		L4.setBounds(50, 190, 50, 50);

		L4.pack();


		final Text T4 = new Text(shell, SWT.BORDER);

		T4.setBounds(130, 190, 50, 50);

		T4.pack();


		Label L5 = new Label(shell, SWT.NONE);

		L5.setText("PLZ:");

		L5.setBounds(50, 220, 50, 50);

		L5.pack();


		final Text T5 = new Text(shell, SWT.BORDER);

		T5.setBounds(130, 220, 50, 50);

		T5.pack();


		MouseAdapter mouse_write = new MouseAdapter() {

			public void mouseDown(MouseEvent e) {

				{

					int i = 0;


					//for (i = 0; i < Daten.length; i++)

						Daten[0] = new Datensatz(T1.getText(), T2.getText(), T3.getText(), T4.getText(), T5.getText());


					try {

						IO.write(Daten);


					} catch (Exception ex) {

						ex.printStackTrace();

					}

				}

			}

		};


		MouseAdapter mouse_read = new MouseAdapter() {

			public void mouseDown(MouseEvent e) {


				try {


					Datensatz Daten[] = IO.read();


					int i = 0;


					T1.setText(Daten[i].Vorname);

					T2.setText(Daten[i].Nachname);

					T3.setText(Daten[i].Wohnort);

					T4.setText(Daten[i].Strasse);

					T5.setText(Daten[i].PLZ);


				} catch (ClassNotFoundException e1) {

					e1.printStackTrace();

				} catch (IOException e2) {

					e2.printStackTrace();

				}

			}

		};


		MouseAdapter mouse_clear = new MouseAdapter() {

			public void mouseDown(MouseEvent e) {


					T1.setText("");

					T2.setText("");

					T3.setText("");

					T4.setText("");

					T5.setText("");


			}

		};


		MouseAdapter mouse_next = new MouseAdapter() {

			public void mouseDown(MouseEvent e) {


				//try {


					//IO.read();



					for (int zaehler=0;zaehler<Daten.length;zaehler++){

					T1.setText(Daten[zaehler].Vorname);

					T2.setText(Daten[zaehler].Nachname);

					T3.setText(Daten[zaehler].Wohnort);

					T4.setText(Daten[zaehler].Strasse);

					T5.setText(Daten[zaehler].PLZ);

					System.out.println(zaehler);}


				/*} catch (ClassNotFoundException e1) {

					System.out.println("Mysterious...");

				} catch (IOException e1) {

					System.out.println("Mysterious...");

				}*/

			}

		};


		B1.addMouseListener(mouse_write);

		B3.addMouseListener(mouse_read);

		B2.addMouseListener(mouse_next);

		B4.addMouseListener(mouse_clear);


		shell.addListener(SWT.Close, new Listener() {

			public void handleEvent(Event event) {

				int style = SWT.APPLICATION_MODAL | SWT.YES | SWT.NO;

				MessageBox messageBox = new MessageBox(shell, style);

				messageBox.setText("Information");

				messageBox.setMessage("Programm wirklich schliessen?");

				event.doit = messageBox.open() == SWT.YES;

			}

		});


		while (!shell.isDisposed()) {

			if (!display.readAndDispatch())

				display.sleep();

		}

		display.dispose();


	}

}

Geschrieben

Was sollen wir denn mit den ganzen Codefragmenten? Hast Du bei Dir schon mal sinnvolle Testausgaben generiert oder in die Anwendung reindebuggt? Das sollte der erste Weg sein, um rauszufinden, was beim Schreiben und beim Lesen passiert.

Peter

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...