Objekte werden nicht aus Datei eingelesen

Status
Nicht offen für weitere Antworten.

iCeFrEsH

Mitglied
Hallo zusammen,

bin derzeit daran eine Highscoreliste für ein Spiel zu schreiben, welche sich automatisch in einer Datei speichert und lädt. Speichern tut sie, öffnen geht aber nicht. Hier der Code:

Code:
 File datei = new File("C:\\highscore.dat");
    try {
      FileInputStream fis = new FileInputStream(datei);
      ObjectInputStream ois = new ObjectInputStream(fis);
      // Objekte einlesen
      TableModelHighscoreList.getInstance().setHighscoreliste((ArrayList<HighscoreEintrag>) ois.readObject());
      // Stream schließen
      fis.close();
      System.out.println("GELESEN");  // nur zum debuggen da
    }
    catch (Exception e1) {
      // TODO Auto-generated catch block
      e1.printStackTrace();
    }

Das GELESEN aus dem System.out erscheint auch, sonst kommt auch keine Fehlermeldung =(


Danke schonmal! :)
 
S

SlaterB

Gast
nichts spricht dafür, dass in C:\\highscore.dat irgendwas drinsteht,
es fehlt die zugehörige write-Operation sowie überhaupt ein komplettes Programm drumherum,

und das ganze möglichst kurz,
HighscoreEintrag sollte eine Dummy-Serializable-Klasse sein, nur mit einem String "test" oder so darin,

TableModelHighscoreList usw. wird nicht benötigt,
nur eine main mit 'Liste erstellen', 'Liste schreiben', 'Liste lesen' ausgeben und fertig
 

iCeFrEsH

Mitglied
Also in C:\highscore.dat steht etwas drinnen, das hat es vorher hineingeschrieben. Dort steht drinnen (falls es wen interessiert):

Code:
¬í sr java.util.ArrayListx￾Ò™Ça￾ I sizexp   w   
sr spiderschwein.HighscoreEintrag×£ˆ’};ó I punkteL namet Ljava/lang/String;xp  ît Testx

Hier mal die komplette Datei (Hinweis: die beiden Buttons dienen derzeit nur zum debuggen):
Code:
package spiderschwein;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JToggleButton;
import javax.swing.JButton;

public class HighscoreListGUI extends JFrame {

  private JPanel jContentPane = null;
  private JScrollPane scpHighscoreList = null;
  private JTable tabHighscoreList = null;
//  private ArrayList einträge = new ArrayList();
  private JToggleButton btnRestart = null;
  private JButton btnBeenden = null;
  
  /**
   * This is the default constructor
   */
  public HighscoreListGUI() {
    super();
    initialize();
  }

  /**
   * This method initializes this
   * 
   * @return void
   */
  private void initialize() {
    this.setSize(284, 242);
    this.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
    this.setContentPane(getJContentPane());
    this.setTitle("Highscore Liste");
    this.addWindowListener(new java.awt.event.WindowAdapter() {   
    	public void windowClosed(java.awt.event.WindowEvent e) {    
       speichern();
    	}
      public void windowOpened(java.awt.event.WindowEvent e) {
       oeffnen();
      }
      
});
  }

  /**
   * This method initializes jContentPane
   * 
   * @return javax.swing.JPanel
   */
  private JPanel getJContentPane() {
    if (jContentPane == null) {
      jContentPane = new JPanel();
      jContentPane.setLayout(null);
      jContentPane.add(getScpHighscoreList(), null);
      jContentPane.add(getBtnRestart(), null);
      jContentPane.add(getBtnBeenden(), null);
    }
    return jContentPane;
  }

  /**
   * This method initializes jScrollPane  
   *  
   * @return javax.swing.JScrollPane  
   */
  private JScrollPane getScpHighscoreList() {
    if (scpHighscoreList == null) {
      scpHighscoreList = new JScrollPane();
      scpHighscoreList.setBounds(new java.awt.Rectangle(0,-2,280,179));
      scpHighscoreList.setViewportView(getTabHighscoreList());
    }
    return scpHighscoreList;
  }

  /**
   * This method initializes jTable 
   *  
   * @return javax.swing.JTable 
   */
  private JTable getTabHighscoreList() {
    if (tabHighscoreList == null) {
      tabHighscoreList = new JTable(TableModelHighscoreList.getInstance());
    }
    return tabHighscoreList;
  }

//  public boolean add(Object neuerUser) {
//    return einträge.add(neuerUser);
//  }

  /**
   * This method initializes btnRestart	
   * 	
   * @return javax.swing.JToggleButton	
   */
  private JToggleButton getBtnRestart() {
    if (btnRestart == null) {
      btnRestart = new JToggleButton();
      btnRestart.setText("Neustart");
      btnRestart.setSize(new java.awt.Dimension(130,30));
      btnRestart.setLocation(new java.awt.Point(0,175));
      btnRestart.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent e) {
          oeffnen();
        }
      });
    }
    return btnRestart;
  }

  /**
   * This method initializes btnBeenden	
   * 	
   * @return javax.swing.JButton	
   */
  private JButton getBtnBeenden() {
    if (btnBeenden == null) {
      btnBeenden = new JButton();
      btnBeenden.setLocation(new java.awt.Point(138,175));
      btnBeenden.setText("Beenden");
      btnBeenden.setSize(new java.awt.Dimension(130,30));
      btnBeenden.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent e) {
          speichern();
        }
      });
    }
    return btnBeenden;
  }

  
  public void speichern(){
    File datei = new File("C:\\highscore.dat");
    try {
      datei.createNewFile();
      FileOutputStream fos = new FileOutputStream(datei);
      ObjectOutputStream oos = new ObjectOutputStream(fos);
      // Kundenliste serialisieren
      oos.writeObject(TableModelHighscoreList.getInstance().getHighscoreliste());
      fos.close();
      System.out.println("OK, saved");
    }
    catch (IOException e1) {
      // TODO Auto-generated catch block
      e1.printStackTrace();
      System.out.println("Fehler");
    }
  }
  
  public void oeffnen(){
    File datei = new File("C:\\highscore.dat");
    try {
      FileInputStream fis = new FileInputStream(datei);
      ObjectInputStream ois = new ObjectInputStream(fis);
      // Objekte einlesen
      TableModelHighscoreList.getInstance().setHighscoreliste((ArrayList<HighscoreEintrag>) ois.readObject());
      // Stream schließen
      fis.close();
      System.out.println("GELESEN");
    }
    catch (Exception e1) {
      // TODO Auto-generated catch block
      e1.printStackTrace();
    }
  }
  
}  //  @jve:decl-index=0:visual-constraint="10,10"

Und die Objektklasse:

Code:
package spiderschwein;
import java.io.Serializable;
public class HighscoreEintrag implements Serializable{

  private String name;
  private int punkte;
  
    
  public HighscoreEintrag(String name, int punkte) {
    this.name = name;
    this.punkte = punkte;
  }
  
  public String getName() {
    return name;
  }
  public int getPunkte() {
    return punkte;
  }
  
  
}


und zu guter letzt das Tablemodel:
Code:
package spiderschwein;
import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;

import javax.swing.table.AbstractTableModel;

public class TableModelHighscoreList extends AbstractTableModel implements Observer {

  private String[] colHeads={"Name", "Punkte"};
  private ArrayList<HighscoreEintrag> einträge = new ArrayList<HighscoreEintrag>();
  private static TableModelHighscoreList container = null;
  
    private TableModelHighscoreList() {
    }
    
    public static TableModelHighscoreList getInstance(){
      if(container==null){
        container = new TableModelHighscoreList();
      }
      return container;
    }

    public boolean add(HighscoreEintrag o) {
    return einträge.add(o);
  }

  public Object get(int index) {
    return einträge.get(index);
  }

  public Object remove(int index) {
    return einträge.remove(index);
  }

  public Object set(int index, HighscoreEintrag element) {
    return einträge.set(index, element);
  }

  public int size() {
    return einträge.size();
  }
  
  public ArrayList<HighscoreEintrag> getHighscoreliste() {
    return einträge;
  }
  
  public void setHighscoreliste(ArrayList<HighscoreEintrag> einträge) {
    einträge = this.einträge;
  }



  //gibt die Anzahl der Tabellenzeilen an
    public int getRowCount() {
      return einträge.size();
    }

    //gibt die Anzahl der Spalten an
    public int getColumnCount() {
      return colHeads.length;
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
      HighscoreEintrag einEintrag = einträge.get(rowIndex);
      switch(columnIndex){
        case 0: return einEintrag.getName();
        case 1: return einEintrag.getPunkte();
        }
      return null;
    }
    
    //gibt die Spaltenüberschrift zurück
    public String getColumnName(int spalte){
      return colHeads[spalte];
    }

    public void update(Observable o, Object arg) {
      fireTableDataChanged();
    }

  }

Vielleicht hilft das jemanden weiter - ohne euch verwirren zu wollen ;)
 

iCeFrEsH

Mitglied
NTB hat gesagt.:
Bitte nochmal den Beitrag von SlaterB lesen und verstehen :)

Hmmm, okay, dann arbeiten wir uns mal Stück für Stück durch:

nichts spricht dafür, dass in C:\\highscore.dat irgendwas drinsteht,
--> doch, habe ich ja gepostet

es fehlt die zugehörige write-Operation sowie überhaupt ein komplettes Programm drumherum,
--> ist auch drinne, siehe Programmcode - funktioniert auch, sonst würde ja nichts in der Datei stehen

und das ganze möglichst kurz, HighscoreEintrag sollte eine Dummy-Serializable-Klasse sein, nur mit einem String "test" oder so darin,
--> Objekt von HighscoreEintrag wird nach Spiel (dessen Quelltext ich nicht gepostet habe, da es funktioniert und mit der Highscore wenig zu tun hat) angelegt. Name + Punktzahl wird in der Tabelle des HighscoreListGUI auch angezeigt.

TableModelHighscoreList usw. wird nicht benötigt, nur eine main mit 'Liste erstellen', 'Liste schreiben', 'Liste lesen' ausgeben und fertig
Wird imo doch benötigt, da ich eine JTable on JScrollPane verwende. Aber daran sollte es ja nicht liegen ;)

Sofern, ich blick irgendwie gerade nicht mehr so ganz durch, wieso es nicht geht :(
 
S

SlaterB

Gast
Code:
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        speichern();
        oeffnen();
    }

    public static void speichern()
        throws Exception
    {
        List<HighscoreEintrag> list = new ArrayList<HighscoreEintrag>();
        list.add(new HighscoreEintrag());

        File datei = new File("highscore.dat");
        FileOutputStream fos = new FileOutputStream(datei);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(list);
        fos.close();
        System.out.println("OK, saved");
    }

    public static void oeffnen()
        throws Exception
    {
        File datei = new File("highscore.dat");
        FileInputStream fis = new FileInputStream(datei);
        ObjectInputStream ois = new ObjectInputStream(fis);
        List<HighscoreEintrag> list = (List<HighscoreEintrag>)ois.readObject();
        fis.close();
        System.out.println("GELESEN: " + list);
    }

}


class HighscoreEintrag
    implements Serializable
{
    public String toString()
    {
        return "huhu";
    }
}

funktioniert,
was in deinem Code dagegen nicht funktioniert ist ohne ein lauffähiges kurzes Programm nicht nachvollziehbar,

vielleicht klappt ja sogar schon das Lesen (gib die Liste nach dem Lesen aus)
und dein Problem hat gar nichts mit Dateien zu tun?

> Wird imo doch benötigt, da ich eine JTable on JScrollPane verwende

es ist allein interessant, ob die Liste nach dem Lesen da ist oder nicht, ein TableModel kann dabei nicht helfen
 

HoaX

Top Contributor
Code:
  public void setHighscoreliste(ArrayList<HighscoreEintrag> einträge) {
    einträge = this.einträge;
    fireTableDataChanged(); // der Table will wissen dass sich die Daten geändert haben
  }

ich vermute jetz einfach mal das es geht ;)
 

iCeFrEsH

Mitglied
HoaX hat gesagt.:
Code:
  public void setHighscoreliste(ArrayList<HighscoreEintrag> einträge) {
    einträge = this.einträge;
    fireTableDataChanged(); // der Table will wissen dass sich die Daten geändert haben
  }

ich vermute jetz einfach mal das es geht ;)

Sehr gute Idee, aber es funktioniert dennoch nicht =(
 
S

SlaterB

Gast
stell doch bitte endlich mal fest, ob das Datei-einlesen geht oder nicht
und der Rest nur noch ein Problem der Anzeige ist,

dann kann man von vorne anfangen und den unnützen Datei-Code rausschmeißen und ein anderes Test-Programm nur zum aktuellen Problem schreiben

immer Schritt für Schritt vorgehen..
 

iCeFrEsH

Mitglied
Okay, habe ich jetzt gemacht.
Er liest die Datei wirklich ein, aber die Tabelle aktualisiert sich nicht...

Btw: noch ein Fehler... Wenn ich die Highscoreliste speicher, klappt alles. Lade ich sie danach (im noch offenen GUI) - funktioniert es auch ohne Fehlermeldung. Schließe ich aber das GUI (die Liste ist jetzt immer noch in einer Datei gespeichert), starte das GUI neu und lese sie ein bekomme ich für meine Debug-System.out. ausgabe (gibt den Namen auf der Konsole aus, zum debuggen --> so habe ich ja rausgefunden dass die Datei eig. korrekt eingelesen wird):

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

Obwohl der Eintrag in der Datei drinnen steht =(
 
S

SlaterB

Gast
an welcher Stelle?


----------

zum ersten Fehler:
hat sich hartnäckig versteckt, aber mit viel Debuggen bei sich nicht ändern wollender Anzeige kommt man schließlich zu

this.einträge = einträge;
statt
einträge = this.einträge;

in setHighscoreliste()

fireTableDateChanged() trotzdem noch dazu
 

iCeFrEsH

Mitglied
Danke!!! Da hatte ich wohl voll denen Dreher drinnen...
So, das Einlesen funktioniert jetzt. Jedoch nicht korrekt:

1. Erster User spielt Spiel, kommt in Highscoreliste - steht auch drinnen, wird auch gespeichert, kann auch geöffnet werden,
2. Zweiter User spielt Spiel, kommt auch in Highscoreliste. Trägt seinen Namen ein, Name erscheint aber nicht. Speichert, aber nur erster User steht in der Liste... =(
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 Weiß jemand wie ich im Scenebuilder das Fenster so darstellen kann, dass beim Vollbildmodus die Objekte so angezeigt werden? Allgemeine Java-Themen 1
J Neue Objekte werden nciht angezeigt Allgemeine Java-Themen 2
schegga_B javax.crypto - Cipher Objekte - Sevice Provider matching? Allgemeine Java-Themen 1
A Einzelne Objekte und Unterobjekte einer ArrayList ausgeben Allgemeine Java-Themen 53
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
N einem Array Objekte hinzufügen die ihr Array position gespeichert haben Allgemeine Java-Themen 34
E Objekte in einen String packen und wieder laden Allgemeine Java-Themen 5
L Objekte in Set nicht gefunden Allgemeine Java-Themen 13
Avalon Data Transfer Objekte aus Datenbank erstellen Allgemeine Java-Themen 8
G Objekte mit Strings Aufrufen Allgemeine Java-Themen 8
H Objekte speichern und laden Allgemeine Java-Themen 10
H Objekte speichern und laden Allgemeine Java-Themen 1
MiMa Referenz auf Objekte und deren Inhalte Allgemeine Java-Themen 12
W Objekte reproduzieren Allgemeine Java-Themen 2
W Objekte per Reflexion instanziieren Allgemeine Java-Themen 7
W Unittest - Objekte simulieren Allgemeine Java-Themen 7
T OOP Objekte mit Erweiterung Initialisieren Allgemeine Java-Themen 6
O Erste Schritte Objekte als Datenelemente Allgemeine Java-Themen 14
J Equals Mock Objekte Allgemeine Java-Themen 5
J Mockito - Objekte miteinander vergleichen (equals) Allgemeine Java-Themen 6
N Bei Mouse Events nicht mehrere Objekte erstellen Allgemeine Java-Themen 13
J Zugriff auf erstellte Objekte einer Klasse von einer Klasse ausserhalb Allgemeine Java-Themen 3
J Java Objekte = null, Garbagecollector Allgemeine Java-Themen 12
F Listen - Mehrere Objekte Allgemeine Java-Themen 1
J Verständnis Frage zur Instanz, Objekte, Instanzierung, Referenz Allgemeine Java-Themen 14
F Objekte erzeugen Allgemeine Java-Themen 1
E Threads ThreadPoolExecutor remove mit callable Objekte Allgemeine Java-Themen 3
P mehrer Verschiedene Objekte in einer Klasse erstellen. Allgemeine Java-Themen 4
E OOP Objekte und Methoden Allgemeine Java-Themen 1
@SupressWarnings() Umgebungsvariable Objekte "gekoppelt" Allgemeine Java-Themen 6
S Algorithmus um Objekte auf einer Flaeche mit gleichem Abstand anzuordnen..? Allgemeine Java-Themen 20
C Objekte in Array List speichern? Allgemeine Java-Themen 1
OnDemand Objekte speichern Allgemeine Java-Themen 8
B Objekte anhand von Properties file Allgemeine Java-Themen 41
U Tiefe Objekte schreiben Allgemeine Java-Themen 1
R Abstrakte Basisklasse und instanzierte Objekte der abgeleiteten Klasse als Basisklasse übergeben Allgemeine Java-Themen 2
E 3D Objekte in 2D Bild finden Allgemeine Java-Themen 5
J Daten aus GUI auslesen und in Objekte umwandeln Allgemeine Java-Themen 6
F FileOutput/Input Objekte Allgemeine Java-Themen 6
OnDemand Objekte serialisieren Allgemeine Java-Themen 3
J unterschiedliche Objekte, selbe getter und setter Allgemeine Java-Themen 15
L Lib gesucht: Java-Objekte mit JSON Allgemeine Java-Themen 2
U Set erklären dass objekte gleich sind Allgemeine Java-Themen 12
E Best Practice Verdammt große Objekte Allgemeine Java-Themen 10
B Mehrere Objekte verschlüsselt serialisieren Allgemeine Java-Themen 6
G Liste anzahl der gleichen Objekte Allgemeine Java-Themen 6
N Objekte an eine andere Applikation übergeben Allgemeine Java-Themen 3
N 2 Objekte zu einer Gruppe zusammenfügen Allgemeine Java-Themen 7
M Instanzierte Objekte in XML Dokument speichern Allgemeine Java-Themen 3
B Verschiedene Objekte in Abhängigkeit eines Typs instanziieren. Allgemeine Java-Themen 17
K Input/Output Im Programm instanzierte Objekte Speichern und laden Allgemeine Java-Themen 3
S OOP Objekte als Return-Werte: Einen Klon zurückgeben oder Instanz auf das Feld? Allgemeine Java-Themen 10
H Objekte Serialisiert speichern Allgemeine Java-Themen 10
L MouseListener für viele Objekte erstellen Allgemeine Java-Themen 16
5 Objekte Sortieren lassen Allgemeine Java-Themen 7
N Objekte aus Array Inhalt erzeugen Allgemeine Java-Themen 8
L Input/Output Textdatei in Objekte überführen? Allgemeine Java-Themen 4
R Input/Output Objekte speichern ohne überschreiben Allgemeine Java-Themen 7
A Collections HashMap.containsKey findet keine immutablen Objekte Allgemeine Java-Themen 3
H Threads Thread stirbt aber Objekte in ihm leben weiter?! Allgemeine Java-Themen 9
M Java Objekte in XML mit JAXB Allgemeine Java-Themen 9
C Strings und JSON Objekte so klein wie möglich im Speicher ablegen Allgemeine Java-Themen 5
H COM-Objekte/ AktiveX Objekte Allgemeine Java-Themen 4
C Script für Website mit Objekte Ausblenden Allgemeine Java-Themen 3
M Txt einlesen & Objekte erzeugen Allgemeine Java-Themen 2
X Objekte aus TableModel serialisieren und deserialisieren Allgemeine Java-Themen 4
T ObjectInputStream - Arrayliste, die unbekannte Objekte enthält Allgemeine Java-Themen 9
B class dateien "einlesen" und objekte erzeugen Allgemeine Java-Themen 6
D Grafische Objekte zeichnen Allgemeine Java-Themen 4
A Wie zur Laufzeit auf Objekte zugreifen Allgemeine Java-Themen 7
F Referenzen auf Objekte Allgemeine Java-Themen 5
H Eclipse und Objekte Allgemeine Java-Themen 6
S Objekte die Objekte enthalten: Keine Vererbung Allgemeine Java-Themen 4
E Objekte in einer Liste suchen. Allgemeine Java-Themen 4
I Über eine Liste iterieren und Objekte löschen. Wie löst man das sauber? Allgemeine Java-Themen 5
I Pattern zum Erweitern existierender Objekte Allgemeine Java-Themen 4
N Dynamische Objekte / DB Allgemeine Java-Themen 5
J Objekte binär speichern Allgemeine Java-Themen 10
TiME-SPLiNTER Unbekannte Anzahl serialisierter Objekte lesen Allgemeine Java-Themen 2
V Objekte in Kategorien einteilen. Allgemeine Java-Themen 6
M 3D Objekte mit einer Linie Verbinden Allgemeine Java-Themen 3
F Wie zur Laufzeit ganz neue Objekte erzeugen? Allgemeine Java-Themen 5
A Dummy-Objekte für Webgui erzeugen Allgemeine Java-Themen 12
W Objekte speichern mit JFileChooser Allgemeine Java-Themen 8
D befehl auf mehrere objekte anwenden Allgemeine Java-Themen 7
L Objekte in Liste packen Allgemeine Java-Themen 2
S XML in Objekte wandeln. Euer Rat? Allgemeine Java-Themen 12
G Objekte serialisieren Allgemeine Java-Themen 2
L Parameter-Objekte verändern oder nicht? Allgemeine Java-Themen 6
D Objekte nur unter bestimmten Voraussetzungen erzeugen Allgemeine Java-Themen 4
S Objekte mit Arrays Allgemeine Java-Themen 9
F Objekte oder besser ID in Listen speichern? Allgemeine Java-Themen 2
S erzeugte objekte zählen Allgemeine Java-Themen 3
U auf Objekte mit variablem Namen zugreifen Allgemeine Java-Themen 4
Airwolf89 dynamischer Zugriff auf Variablen/ Objekte Allgemeine Java-Themen 4
Landei Objekte ohne Konstruktoraufruf erzeugen Allgemeine Java-Themen 7
E tiefe Kopie nicht serialisierbarer Objekte Allgemeine Java-Themen 3
J Speicherbedarf und persistente Objekte Allgemeine Java-Themen 4
J ArrayList Objekte anhand Propertywerte filtern Allgemeine Java-Themen 3
R Moeglichst viele Datumsstrings in Date Objekte konvertieren? Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben