200 likes | 279 Views
Javan oliovirrat eli oliotiedostojen käsittely. Olio- eli objektitiedostojen käsittely. Käsittely täysin samanlaista kuin muiden tiedostojen Otetaan yhteys fyysiseen tietovarastoon ja luodaan tiedostoyhteys Kirjoitetaan tiedosto / luetaan tiedosto Suljetaan yhteys.
E N D
Javan oliovirrat eli oliotiedostojen käsittely
Olio- eli objektitiedostojen käsittely • Käsittely täysin samanlaista kuin muiden tiedostojen • Otetaan yhteys fyysiseen tietovarastoon ja luodaan tiedostoyhteys • Kirjoitetaan tiedosto / luetaan tiedosto • Suljetaan yhteys
Oliotiedoston kirjoittaminen ObjectOutputStream tiedostoNimi; tiedostoNimi = new ObjectOutputStream (new FileOutputStream(”tiedosto.dat")); Huomaa: tiedoston sisältö on tavuvirtaa (stream) Kirjoitetaan olio tiedostoon: tiedostoNimi.writeObject(olio);
Oliotiedoston lukeminen ObjectInputStream tiedostoNimi;tiedostoNimi = new ObjectInputStream (new FileInputStream(”tiedosto.dat")); Huomaa: tiedoston sisältö on tavuvirtaa (stream) Luetaan Object-luokan ilmentymä: object = tiedostoNimi.readObject();
ObjectInputStream lukee Object- luokan ilmentymiäObjectOutputStream kirjoittaa Object- luokan ilmentymiä? entä omat luokkamme
Miten saadaan omien luokkien ilmentymiin mukaan luokkakuvaukset?
Sarjallistaminen l.Object Serialization • java.io.Serializable rajapinta • ei sisällä yhtään metodia • tehtävänä organisoida olioiden ja niiden luokkakuvausten tiedostotalletus • (+ versiointi, ”sormenjälkitunnistus” jne)
Esimerkki 1 //lyhennetty alkuperäisestä import java.io.Serializable; public class Ajoneuvo implements Serializable{ private String merkki; private String rekisterinumero; private int lukema; private double keskikulutus; public Ajoneuvo() { merkki = null; rekisterinumero = null; lukema = 0; keskikulutus = 0.0; }}
public String toString(){ String paluu; paluu = paluu + lukema + " " + keskikulutus + " l/100 km"; return paluu; }}
Ajoneuvotietojen kirjoittaminen Ajoneuvo ajoneuvo; ObjectOutputStream autoTiedosto;autoTiedosto = new ObjectOutputStream (newFileOutputStream(”ajokit.dat")); hanki ajoneuvotiedot; while (tietoja riittää) { autoTiedosto.writeObject(ajoneuvo); hanki ajoneuvotiedot; } autoTiedosto.close();
Ajoneuvotietojen lukeminen Ajoneuvo ajoneuvo; ObjectInputStream ajokit;autoTiedosto = new ObjectInputStream (new FileInputStream(”ajokit.dat")); ajoneuvo = (Ajoneuvo)autoTiedosto.readObject(); while (ajoneuvo != null) { System.out.println(ajoneuvo.toString()); ajoneuvo = (Ajoneuvo)autoTiedosto.readObject(); } autoTiedosto.close();
Usean luokan olioiden talletus samaan tiedostoon • Ajoneuvo ja siitä periytetty HenkiloAuto • - kun Ajoneuvoon lisätään Serializable rajapinta, HenkiloAuto perii sen • molempien luokkien ilmentymät kirjoitetaan tiedostoon ”ajokit”: • ajokit.writeObject(ajoneuvo); • ajokit.writeObject(henkiloauto); • sujuu mutkattomasti
Oliotiedoston lukeminen Kun tiedostoa luetaan, ei voi olla varma eri luokkien ilmentymien järjestyksestä tarvitaan esimerkiksi instanceof-operaattoria Tarvittavat luokat: Ajoneuvo ajo;HenkiloAuto hauto;Object object; ObjectInputStream tdsto = new ObjectInputStream(new FileInputStream(name));
object = tdsto.readObject(); while(object != null){ if (object instanceof HenkiloAuto) { hauto = new HenkiloAuto((HenkiloAuto) object); System.out.println(hauto.toString()); } else if (object instanceof Ajoneuvo){ ajo = new Ajoneuvo((Ajoneuvo) object); System.out.println(ajo.toString()); } else System.out.println("Tuntematon luokka”); object = tdsto.readObject();}tdsto.close();
HUOMAA: aloita if – else rakenne periytetystä luokasta • esimerkissä järjestys on HenkiloAuto – Ajoneuvo, koska halutaan käyttää HenkiloAuto-luokan metodeja ilmentymän käsittelyyn • järjestys Ajoneuvo-HenkiloAuto toimii, mutta tällöin tulevat käyttöön vain Ajoneuvo-luokan metodit myös HenkiloAuto-luokan ilmentymässä • Vinkki: kokeile Ajoneuvo-HenkiloAuto-järjestystä ja katso kuinka tulostus muuttuu…
Poikkeustilanteet Poikkeustilanteisiin varautuminen java.lang.ClassNotFoundException java.lang.CastClassException java.io.InvalidClassException java.io.InvalidObjectException
Muita mielenkiintoisia java.io-pakkauksen luokkia File, esimerkki: import java.io.*;public class TiedostoTutkinta{ public static void main (String [] args) { try{ File ajokit = new File("ajokit.dat"); String erotin = ajokit.pathSeparator; String polku = ajokit.getPath(); boolean onTdsto = ajokit.isFile(); boolean onKirjoitettava = ajokit.canWrite(); long koko = ajokit.length();
System.out.println("Polkuerotin: " + erotin + "\npolku: " + polku + "\non tiedosto: " + onTdsto + "\non kirjoitettava: " + onKirjoitettava + "\ntiedoston koko: " + koko + " tavua"); } catch(Exception e) { System.out.println(e.getMessage()); } }}
Tulostaa: Polkuerotin: ;polku: ajokit.daton tiedosto: trueon kirjoitettava: truetiedoston koko: 260 tavua
Kannattaa tutustua myös luokkiin • DataInputStream • DataOutputStream