Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: Olioiden tallennus tiedostoon

Sivun loppuun

kayttaja-1634 [02.08.2011 14:55:40]

#

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.

Metabolix [02.08.2011 15:03:51]

#

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).

Macro [02.08.2011 15:07:40]

#

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ä.

Metabolix [02.08.2011 15:13:18]

#

Macro, katsohan nyt vähän tuota viimeistä koodinpätkääsi. :D Ja edellisessäkin on oos.close eikä ois.close.

Macro [02.08.2011 15:15:24]

#

Oho. Korjasin virheelliset kohdat.

Muokkaus. Ehdinkin ennen viestiäsi korjaamaan oos -> ois.

Metabolix [02.08.2011 15:19:52]

#

Kyllä tuo viimeinen – siis kaikista helpoin – on edelleen aika pahasti pielessä. Katso vielä tarkemmin.

Macro [02.08.2011 15:23:31]

#

Mistäköhän tuo main-funktio sinne tuli? Kiitos.

kayttaja-1634 [03.08.2011 09:56:31]

#

Ok, kiitoksia koodista ja vinkeistä!
Ehkä näillä eväillä pääsee etenemään taas :>


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta