Seppe123 Geschrieben 28. April 2010 Geschrieben 28. April 2010 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 Zitieren
Ulfmann Geschrieben 28. April 2010 Geschrieben 28. April 2010 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. Zitieren
Seppe123 Geschrieben 28. April 2010 Autor Geschrieben 28. April 2010 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..."); } } } }; Zitieren
Ulfmann Geschrieben 28. April 2010 Geschrieben 28. April 2010 Den relevanten Code postest du nicht. Hast du ans Serialisieren gedacht? Only objects that support the java.io.Serializable interface can be written to streams. ObjectOutputStream (Java Platform SE 6) Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 14.12 Persistente Objekte und Serialisierung Zitieren
Seppe123 Geschrieben 28. April 2010 Autor Geschrieben 28. April 2010 Ja habe ich bereits gemacht: public class Datensatz implements Serializable Zitieren
Dragon8 Geschrieben 29. April 2010 Geschrieben 29. April 2010 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. Zitieren
Seppe123 Geschrieben 29. April 2010 Autor Geschrieben 29. April 2010 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..."); } } }; Zitieren
kingofbrain Geschrieben 29. April 2010 Geschrieben 29. April 2010 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 Zitieren
Seppe123 Geschrieben 29. April 2010 Autor Geschrieben 29. April 2010 Fehlermeldung bekomme ich nicht. Er speichert aber anscheind nichts in die Dat-Datei und Auslesen klappt auch nicht. Zitieren
Dragon8 Geschrieben 29. April 2010 Geschrieben 29. April 2010 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. Zitieren
kingofbrain Geschrieben 29. April 2010 Geschrieben 29. April 2010 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 Zitieren
Seppe123 Geschrieben 29. April 2010 Autor Geschrieben 29. April 2010 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. Zitieren
kingofbrain Geschrieben 29. April 2010 Geschrieben 29. April 2010 Dann arbeite doch mal mit Kontrollausgaben oder debugge das Programm, damit Du weißt, was an welcher Stelle passiert / nicht passiert. Peter Zitieren
Dragon8 Geschrieben 29. April 2010 Geschrieben 29. April 2010 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? Zitieren
Seppe123 Geschrieben 29. April 2010 Autor Geschrieben 29. April 2010 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(); } } Zitieren
kingofbrain Geschrieben 30. April 2010 Geschrieben 30. April 2010 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 Zitieren
Empfohlene Beiträge
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.