Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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.

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...");

					}

				}

			}

		};

Ja habe ich bereits gemacht: public class Datensatz implements Serializable

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.

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...");

				}

			}

		};

Erhältst Du einen Fehler? Die Ausgaben, die Du im Exception-Fall machst, sind ja nicht so richtig aussagekräftig. Pack mal noch einen e.printStackTrace() mit dazu.

Peter

Fehlermeldung bekomme ich nicht. Er speichert aber anscheind nichts in die Dat-Datei und Auslesen klappt auch nicht.

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.

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

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.

Dann arbeite doch mal mit Kontrollausgaben oder debugge das Programm, damit Du weißt, was an welcher Stelle passiert / nicht passiert.

Peter

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?

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();


	}

}

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.