Olisi tuossa eräässä harjoitustyössä pieni oliontallennusongelma.
Ohjelma lukee muutamaa erityyppistä oliota ArrayListiin. Kaikki pelaa hyvin ohjelman käytön ajan, mutta nyt pitäisi vielä lisätä systeemi, joka tallentaa ArrayListin tai sen sisällön tiedostoon ja avattaessa lataa oliot takaisin ArrayListiin tai ArrayListin sellaisenaan -- kumpi nyt on mahdollista tai käytännöllisempää.
Kokeilin tuossa jotain perusjuttuja, joissa tallennusketjussa mukana olevat luokat implementoivat Serializablea jne. Homma vaikuttaa tällä hetkellä kuitenkin lähinnä hapuilulta, joten jos jollain on heittää linkkiä toimivaan kuvauksen mukaiseen systeemiin tai yleisiä toimintaohjeita, antaa tulla vain.
Javan serialisointi ei ole pitkällä tähtäimellä hyvä lähestymistapa tiedostojen tallennukseen. Tallenna luokan tiedot jossain itse valitsemassasi muodossa (esim. tekstitiedostoon yksi muuttuja per rivi).
Olioiden, joita kirjoitat tiedostoon, on toteutettava Serializable-luokka. Se ei määrittele mitään metodeja.
Kirjoittaminen onnistuu näin
package olioidenio; import java.io.*; public class Kirjoitus { public static void main(String[] args) { Olio o1 = new Olio("Testi1"); Olio o2 = new Olio("Testi2"); FileOutputStream fos = null; ObjectOutputStream oos = null; try { fos = new FileOutputStream("tiedosto.dat"); oos = new ObjectOutputStream(fos); oos.writeObject(o1); oos.writeObject(o2); } catch(Exception e) { System.out.println(e); } finally { if(oos != null) { try { oos.close(); } catch(Exception e) { System.out.println(e); } } } } }
Ja lukeminen näin
package olioidenio; import java.io.*; public class Lukeminen { public static void main(String[] args) { Object o = null; FileInputStream fis = null; ObjectInputStream ois = null; try { fis = new FileInputStream("tiedosto.dat"); ois = new ObjectInputStream(fis); while((o = ois.readObject()) != null) { if(o instanceof Olio) System.out.println((Olio)o); } } catch(Exception e) { System.out.println(e); } finally { if(ois != null) { try { ois.close(); } catch(Exception e) { System.out.println(e); } } } } }
Olio-luokka näyttäisi tältä
package olioidenio; import java.io.Serializable; public class Olio implements Serializable { String data = null; public Olio(String data) { this.data = data; } public String toString() { return data; } }
En testannut, mutta kääntäjä varmaan kertoo jos on jotain pielessä.
Macro, katsohan nyt vähän tuota viimeistä koodinpätkääsi. :D Ja edellisessäkin on oos.close eikä ois.close.
Oho. Korjasin virheelliset kohdat.
Muokkaus. Ehdinkin ennen viestiäsi korjaamaan oos -> ois.
Kyllä tuo viimeinen – siis kaikista helpoin – on edelleen aika pahasti pielessä. Katso vielä tarkemmin.
Mistäköhän tuo main-funktio sinne tuli? Kiitos.
Ok, kiitoksia koodista ja vinkeistä!
Ehkä näillä eväillä pääsee etenemään taas :>
Aihe on jo aika vanha, joten et voi enää vastata siihen.