Array opslaan en openen

Status
Niet open voor verdere reacties.

poelske88

Gebruiker
Lid geworden
2 aug 2008
Berichten
36
Ik werk sinds kort met java elcipse en heb een programma gemaakt. ik zou nu graag elke keer je het programma afspeelt een array aanmaken (dit is al gelukt) en dan dit array opslaan in een bestand, de volgende keer als je het afspeelt zou hij dan dit array terug moeten halen en dan wissen zodat hij volgend array terug kan opslaan.

Hoe begin ik hieraan, heefte er iemmand wat code

Bedankt
 
Je kan natuurlijk zelf array naar een bestand gaan schrijven en weer inlezen.
Maar handiger is het mischien om gebruik te maken van Java functies.

Je hebt de keuze uit 2 mogelijkheden.
Serialization. (google op ObjectOutputStream en ObjectInputStream).. Hier mee kan je java objecten naar bestand schrijven en weer inlezen.

Long term Persistence (google op XMLEncoder en XMLDecoder). Hier mee kan je java objecten naar XML bestanden schrijven.

Deze laatste methode is ingewikkelder in gebruik, maar wel beter. Werkt echter niet zomaar op een array, maar wel met ArrayList.

Succes
 
Ik heb een voorbeeld programmaatje geschreven, hopelijk is commentaar in de code voldoende... ;)

Het doet niets bijzonders. Het berekent de getallen van fibonacci. Je geeft op hoeveel getallen je wilt hebben en dan wordt een array aangemaakt met de getallen.

Het gebruikt beide manieren om een object op te slaan.
Serialization is het eenvoudigst, JAVA neemt alle variabelen uit je klasse en zet ze in bestand,
Bij het terug lezen worden alle variable weer ingelezen en je object is weer klaar voor gebruik. :)
Dit is vooral bedoeld voor tijdelijk opslaan van je objecten. (Als het aantal variabele in je klasse wijzigt zijn je bestanden onbruikbaar geworden..)

XMLEncode/Decoder is veel ingewikkelder. Java zoekt uit hoe jou object is aangemaakt en slaat dit op.
Er wordt gekeken naar welke functies (dus niet variabelen!) in je klasse werden aangeroepen.( vandaar dat je naamgeving belangrijk wordt.!)
Omdat functie niet snel zullen wijzigen is dit bedoelt voor "long term" opslag.. Verder is bestand well formated XML. zodat zeer geschikt is om over het internet te versturen.
Als je ooit netwerk spelletjes gaat schrijven is dit "the way to go"

Ik zal zeker beginnen met "serialization" en niet zelf array gaan opslaan en inlezen (dit is zeker mogelijk en ook nog eevoudig Maar als je meer variabele gaat opslaan gaat dit niet meer lukken).

succes...

ps. de try catch constructie zijn niet 100% ok.. maar wel lekker kort...;)

Code:
package saveclassdemo;

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)  {

        FibonacciReeks reeks = new FibonacciReeks();
        reeks.setAantal(10); // maak lijst van 10 getallen..
        System.out.println(reeks.toString());    
        
        //save reeks using serialization.
        System.out.println("saving using serialization");    
        try {
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("fibronacci.dat"));
            oos.writeObject(reeks);
            oos.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
      
        //create new reeks
        System.out.println("create new reeks");    
        reeks.setAantal(5);
        
        System.out.println(reeks.toString());
        
        //load old reeks
        System.out.println("load old reeks");
        try {
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("fibronacci.dat"));
            //readObject geeft een object terug we moeten de compiler vertellen dat het een Fibonacci reeks was vandaar de cast.
            reeks = (FibonacciReeks) ois.readObject(); 
            ois.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        System.out.println(reeks.toString());
       
         // nu nog eens, save via long term persistence.
        System.out.println("saving usign persistence");
        try {
            XMLEncoder xe = new XMLEncoder(new BufferedOutputStream(new FileOutputStream("fibronacci.xml")));
            xe.writeObject(reeks);
            xe.close();
        } catch (IOException ex) {
             ex.printStackTrace();
        }
        
        //create new reeks
        System.out.println("create new reeks");    
        reeks.setAantal(20);
        System.out.println(reeks.toString());

         //load old reeks
        System.out.println("load old reeks");
        try {
            XMLDecoder  xd = new XMLDecoder(new BufferedInputStream(new FileInputStream("fibronacci.xml")));
            //readObject geeft een object terug we moeten de compiler vertellen dat het een Fibonacci reeks was vandaar de cast.
            reeks = (FibonacciReeks) xd.readObject(); 
            xd.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        System.out.println(reeks.toString());
       
    }

}

Code:
import java.io.Serializable;
// Als je xmlencoder/xmldecoder will gebruiken moet je zorgen dat je klasse voldoet aan de "bean" naamgeving.
// in het kort betekent dit. Dat je variabelen private zijn en getter/setter gebruikt om je variabele te veranderen. 
// variable getallen -> getGetallen & setGetallen (let op hoofdletters!)
//
// Voor serialization is dit allemaal niet nodig dan is het belangrijk dat je "implements Serializable" aan je klasse toevoegt.
public class FibonacciReeks implements Serializable {
    
    private int[] getallen;
    
    public FibonacciReeks() {
    }
    
    public int[] getGetallen() {
        return getallen;
    }
    
    public void setGetallen(int[] getallen) {
        this.getallen = getallen;
    }
    
    //maakt de fibonacci reeks aan. aantal bepaald de lengte van de array.
    public void setAantal(int aantal) {
        if (aantal < 1) {
            throw new IllegalArgumentException("Value should be larger than 0");
        }
        getallen = new int[aantal];
        getallen[0]=0;
        if (aantal==1) {
            return;
        }
        getallen[1]=1;
        for (int i = 2 ; i < aantal ; i++) {
            getallen[i] = getallen[i-2] + getallen[i-1];
        }
    }
    
    //hoewel er geen variable aantal is doen we net alsof...
    public int getAantal() {
        return getallen == null ? 0 : getallen.length;
    }
    
    //print de array 
    public String toString() {
       if (getallen==null || getallen.length==0) {
           return "Empty";
       }
       StringBuilder sb = new StringBuilder("" + getallen[0]);
       for (int i=1 ; i < getallen.length ;i++) {
           sb.append(',');
           sb.append(getallen[i]);
       }
       return sb.toString();
    }
}
 
alvast bedankt skinflowers,

maar ik zie precies niet direct staan hoe je nu de gegevens opslaat in een bestand op de harde schijf en deze gegevens terug oproept

bedankt
 
De balangrijkste regels voor opslaan via serializatie (eenvoudigste manier)

opslaan:

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("fibronacci.dat"));
oos.writeObject(reeks);

en weer inladen:
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("fibronacci.dat"));
reeks = (FibonacciReeks) ois.readObject();

Zorg dat je alle gevens die je wilt opslaan in een klasse zet. Deze klasse moet de interface Serializable implentereren. (bv public class FibonacciReeks implements Serializable) Maakt niet wat voor data je gebruikt (array's, string, getallen) alles wordt naar disk geschreven.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan