Veld, namen, scores opslagen in een .txt bestand met java

Status
Niet open voor verdere reacties.

DeeM2

Gebruiker
Lid geworden
26 jan 2011
Berichten
9
halo allemaal, zoals iedereen hier blijkbaar ben ik bezig met 4 op een rij.

We zijn al zeer ver gevorderd, maar het probleem is dat als ik in het menu op opslaan klik, ik wel een bestand kan opslaan, maar ik weet niet goed hoe je er voor kan zorgen dat hij de namen, scores en het spelbord wegschrijft.

en deze zou ik dan ook graag kunnen lezen.

hier zit het probleem:
Code:
 mniOpenen.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                               int[][]grid;
                grid = new int[7][6];

                                FileDialog fileDialog = new FileDialog(Frame.this, "Open een bestand", FileDialog.LOAD);
                                fileDialog.setVisible(true);
                                directory = fileDialog.getDirectory();
                                filename = fileDialog.getFile();

                                try {
                                    ObjectInputStream in = new ObjectInputStream(new FileInputStream(
                                            directory + filename));
                                    try {
                                        grid= (int[][]) in.readObject();


                                    } catch (ClassNotFoundException iou) {
                                        JOptionPane.showMessageDialog(null,"Kan bestand niet openen","Fout",JOptionPane.ERROR_MESSAGE);

                                    }
                                } catch (IOException iot) {
                                    JOptionPane.showMessageDialog(null,"Kan bestand niet openen!","Fout",JOptionPane.ERROR_MESSAGE);
                                }

                            }


        });
        mniOpslaan.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                FileDialog fileDialog2 = new FileDialog(Frame.this, "Bewaar een bestand", FileDialog.SAVE);
                fileDialog2.setVisible(true);
                directory = fileDialog2.getDirectory();
                filename = fileDialog2.getFile();
                try {
                    ObjectOutputStream uit = new ObjectOutputStream(new FileOutputStream(directory + filename));

                    uit.close();

                } catch (IOException eo) {
                    JOptionPane.showMessageDialog(null,"Kan bestand niet opslagen","Fout",JOptionPane.ERROR_MESSAGE);
                }
            }


        });

De volledige code:
http://rapidshare.com/files/453054697/VierOpEenRijSwing.zip
 
dit is casten
Code:
Object obj = (Object) in.readObject();
maar weet ook dat er resourcestream file bundle bestaat en kan handiger zijn
wordt gebruikt om multilang sleutels in te plaatsen.
Het object heeft dan de data dat je zou willen.
Let op het kan mislopen als je niet controleert of je het kan casten.
 
dit is casten
Code:
Object obj = (Object) in.readObject();
maar weet ook dat er resourcestream file bundle bestaat en kan handiger zijn
wordt gebruikt om multilang sleutels in te plaatsen.
Het object heeft dan de data dat je zou willen.
Let op het kan mislopen als je niet controleert of je het kan casten.

en hoe zou je dan het casten vervangen door die resourcestream file? hoe werkt die juist?
 
Het casten is eigenlijk voor later...

Eerst een object wegschrijven

je moet nog een object toevoegen aan je outputStream

Code:
uit.writeObject(Object objectMetJeGegevens)

Welk object kan je nu wegschrijven? Wel, eenvoudig, elk object dat Serializable implementeerd...

dus bijvoorbeeld:
Code:
public class MijnScores implements Serializable {

private ArrayList <Score> scores;

public ArrayList<Score> getScores() {return scores}

public void  setScores(ArrayList <Score> scores){this.scores = scores}
}

Belangrijk is dat alles wat je wilt wegschrijven Serializable moet zijn, dus in dit voorbeeld ook Score, want daar is je arraylist uit opgebouwd (en dus ook Grid uit de class Score maar afhankelijk van welke Grid dat je gebruikt kan dat al het geval zijn. Als je naar de API kijkt van ArrayList bijvoorbeeld zal je zien staan dat deze Serializable implementeerd)

Code:
public class Score implements Serializable {

private String name;
private int Score;
private Grid[][] veld;

//-->constructor met fields

//-->getters en setters
}

Als je nu een instantie van MijnScores wegschrijft kan je dus achteraf dit doen:

Code:
MijnScores scores = (MijnScores)in.readObject();
 
Laatst bewerkt:
de uitleg die je geeft is zeer nuttig, maar het probleem is dat als je het volledige project bekijkt. enkel highscores seriazable is, maar dit moet niet meer worden weggeschreven want dit wordt al in een document geschreven. Het is de bedoeling om de namen, huidige scores en het toestand van het bord weg te schrijven naar een bestand. Misschien moet het niet met met Streams? maar met een fileWriter en fileReader?
 
ik heb even iets helemaal opnieuw gevraagd, nu schrijft hij de juiste gegevens weg naar een .txt bestand , maar het inlezen is voor mij nog niet helemaal duidelijk.

dit is schrijven:
Code:
package Model;


import View.Speler;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * Created by IntelliJ IDEA.
 * User: Christoph van Hees$
 * Date: 18/03/11
 * Time: 8:35
 * To change this template use File | Settings | File Templates.
 */
public class Schrijven {
    private static Speler speler = new Speler();
    private static Spel score = new Spel();


     public static void main(String[] args) {
        try {
            PrintWriter os = new PrintWriter(
                    new BufferedWriter(
                            new FileWriter("spelgegevens.txt")));
            os.println(speler.getSpeler1());
            os.println(speler.getSpeler2());

            os.close();
            PrintWriter as = new PrintWriter(
                    new BufferedWriter(
                            new FileWriter("spelgegevens.txt", true)));
            as.println(score.getScoreSp1());
            as.println(score.getScoreSp2());
            as.close();
        } catch (IOException e) {
            System.err.println(e);
        }

    }

    }

Dit is lezen:
Code:
package Model;



import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.NoSuchElementException;
import java.util.StringTokenizer;

/**
 * Created by IntelliJ IDEA.
 * User: Christoph van Hees$
 * Date: 18/03/11
 * Time: 8:35
 * To change this template use File | Settings | File Templates.
 */
public class Lezen {
    public static final String BESTAND = "spelgegevens.txt";
    private BufferedReader is;


    public Lezen() {
        try {
            is =
                    new BufferedReader(
                            new FileReader(BESTAND));

        } catch (FileNotFoundException e) {
            System.out.println("Het bestand " + BESTAND
                    + " kan niet geopend worden!");
        }

    }

    public static void main(String[] args) throws IOException {
          Lezen lezer = new Lezen();

    }

    private void leesGegevens() {
        String regel;
        try {
            while ((regel = is.readLine()) != null) {

                StringTokenizer st = new StringTokenizer(regel);
                int jaar = Integer.parseInt(st.nextToken());
                String titel = st.nextToken("\n");

            }
        } catch (NumberFormatException
                e) {
            System.out.println(e);
        } catch (NoSuchElementException
                e) {
            System.out.println(e);

        } catch (IOException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }


    }
}

achter de het menu Spel Opslaan heb ik dan new Schrijven(); gezet. Als ik schrijven zelf uitvoer schrijft hij het correct weg, maar als ik het in het menu selecteer niet.
 
het bovenstaande is inmiddels ook opgelost, nu wil ik engel nog lezen van het bestand dat ik heb gemaakt en dit toepassen op mijn frame :(

dit is het lezen wat ik tot hiertoe heb:
Graag zou ik willen dat ik lijn per lijn alles kan lezen, en deze bestanden dan kan doorsturen naar JLabel's die inmiddels al aanwezig zijn op mijn frame
Code:
package Model;



import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.NoSuchElementException;
import java.util.StringTokenizer;

/**
 * Created by IntelliJ IDEA.
 * User: Christoph van Hees$
 * Date: 18/03/11
 * Time: 8:35
 * To change this template use File | Settings | File Templates.
 */
public class Lezen {
    public String BESTAND = "spelgegevens.txt";
    private BufferedReader is;


    public Lezen() {
        try {
            is =
                    new BufferedReader(
                            new FileReader(BESTAND));
        BESTAND = is.readLine();


        } catch (FileNotFoundException e) {
            System.out.println("Het bestand " + BESTAND
                    + " kan niet geopend worden!");
        } catch (IOException e) {
              System.out.println("Het bestand " + BESTAND
                    + " kan niet geopend worden!");
        }

    }

    public static void main(String[] args) throws IOException {
          Lezen lezer = new Lezen();

    }

    private void leesGegevens() {
        String regel;
        try {
            while ((regel = is.readLine()) != null) {

                StringTokenizer st = new StringTokenizer(regel);

                                //= st.nextToken("\n");

                                // = Integer.parseInt(st.nextToken());
                                // = Integer.parseInt(st.nextToken());


            }
        } catch (NumberFormatException
                e) {
            System.out.println(e);
        } catch (NoSuchElementException
                e) {
            System.out.println(e);

        } catch (IOException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }


    }
}
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan