Oon yrittänyt ohjelman kanssa vaikka mitä..
lue() -metodin pitäisi palauttaa Huoneisto-tyyppinen olio, mutta en keksi millä sen saisi
toteutettua.
Tietäisikö joku?
[code]
import java.io.*;
public class HuoneistotiedostonKasittelija
extends Object {
private Reader lukuMerkkivirta;
private BufferedReader puskuroituLukuVirta;
private Writer kirjoitusMerkkivirta;
private BufferedWriter puskuroituKirjoitusVirta;
private String tiedostopolku;
/** --------------------------------------------------
Alustaa uuden huoneistotiedoston käsittelijän, joka käsittelee annetun
tiedostopolun päässä sijaitsevaa tiedostoa.
Parameters:
tiedostopolku - käsiteltävän tekstitiedoston (hakemistopolku ja) nimi
------------------------------------------------------*/
public HuoneistotiedostonKasittelija(String tiedostopolku) {
this.tiedostopolku = tiedostopolku;
}
/** ------------------------------------
Kirjoittaa tiedostoon annetun huoneiston tiedot. Jos tiedosto on jo olemassa,
kirjoitetaan vanhan päälle.
Parameters:
huoneisto - tiedostoon kirjoitettava huoneisto
Throws:
IOException - jos tiedoston käsittelyssä ilmeni muita ongelmia (esim. tiedostoon ei
ole kirjoitusoikeuksia)
-------------------------------------------------------*/
public void kirjoita(Huoneisto huoneisto)
throws IOException {
kirjoitusMerkkivirta = new FileWriter(tiedostopolku);
puskuroituKirjoitusVirta = new BufferedWriter(kirjoitusMerkkivirta);
String huoneistonTyyppi = huoneisto.kerroTyyppi();
double huoneistonPintaAla = huoneisto.kerroKoko();
String huoneistonPintaAlaStringina = "" huoneistonPintaAla;
puskuroituKirjoitusVirta.write( huoneistonTyyppi, 1, huoneistonTyyppi.length() );
puskuroituKirjoitusVirta.newLine();
puskuroituKirjoitusVirta.write( huoneistonPintaAlaStringina, 1, huoneistonPintaAlaStringina.length() );
this.puskuroituKirjoitusVirta.newLine();
puskuroituKirjoitusVirta.close();
kirjoitusMerkkivirta.close();
}
/** ----------------------------------------
Lukee tiedostossa kuvatut huoneiston tiedot.
Returns:
tiedostosta luettu huoneisto
Throws:
KelvotonHuoneistotiedosto, - jos tiedoston muotoilussa on virhe (eli tiedosto
loppuu kesken kaiken tai pinta-ala ei ole luku)
IOException - jos tiedoston käsittelyssä ilmeni muita ongelmia (esim. tiedostoa
ei ole olemassa tai siihen ei ole lukuoikeuksia)
-------------------------------------------------------*/
public Huoneisto lue()
throws KelvotonHuoneistotiedosto,
IOException {
lukuMerkkivirta = new FileReader(tiedostopolku);
puskuroituLukuVirta = new BufferedReader(lukuMerkkivirta);
// tässä pitäis lukea() tiedostoon juuri kirjoita metodilla kirjoitetut rivit
// tai kokonainen olio, jos se on mahdollista.
// lopuksi palauttaa koko huoneistoOlio, mutta miten?
String luettuRivi = puskuroituLukuVirta.readLine();
puskuroituLukuVirta.close();
lukuMerkkivirta.close();
}
}
[/code]
lue() -metodin pitäisi palauttaa Huoneisto-tyyppinen olio, mutta en keksi millä sen saisi
toteutettua.
Tietäisikö joku?
[code]
import java.io.*;
public class HuoneistotiedostonKasittelija
extends Object {
private Reader lukuMerkkivirta;
private BufferedReader puskuroituLukuVirta;
private Writer kirjoitusMerkkivirta;
private BufferedWriter puskuroituKirjoitusVirta;
private String tiedostopolku;
/** --------------------------------------------------
Alustaa uuden huoneistotiedoston käsittelijän, joka käsittelee annetun
tiedostopolun päässä sijaitsevaa tiedostoa.
Parameters:
tiedostopolku - käsiteltävän tekstitiedoston (hakemistopolku ja) nimi
------------------------------------------------------*/
public HuoneistotiedostonKasittelija(String tiedostopolku) {
this.tiedostopolku = tiedostopolku;
}
/** ------------------------------------
Kirjoittaa tiedostoon annetun huoneiston tiedot. Jos tiedosto on jo olemassa,
kirjoitetaan vanhan päälle.
Parameters:
huoneisto - tiedostoon kirjoitettava huoneisto
Throws:
IOException - jos tiedoston käsittelyssä ilmeni muita ongelmia (esim. tiedostoon ei
ole kirjoitusoikeuksia)
-------------------------------------------------------*/
public void kirjoita(Huoneisto huoneisto)
throws IOException {
kirjoitusMerkkivirta = new FileWriter(tiedostopolku);
puskuroituKirjoitusVirta = new BufferedWriter(kirjoitusMerkkivirta);
String huoneistonTyyppi = huoneisto.kerroTyyppi();
double huoneistonPintaAla = huoneisto.kerroKoko();
String huoneistonPintaAlaStringina = "" huoneistonPintaAla;
puskuroituKirjoitusVirta.write( huoneistonTyyppi, 1, huoneistonTyyppi.length() );
puskuroituKirjoitusVirta.newLine();
puskuroituKirjoitusVirta.write( huoneistonPintaAlaStringina, 1, huoneistonPintaAlaStringina.length() );
this.puskuroituKirjoitusVirta.newLine();
puskuroituKirjoitusVirta.close();
kirjoitusMerkkivirta.close();
}
/** ----------------------------------------
Lukee tiedostossa kuvatut huoneiston tiedot.
Returns:
tiedostosta luettu huoneisto
Throws:
KelvotonHuoneistotiedosto, - jos tiedoston muotoilussa on virhe (eli tiedosto
loppuu kesken kaiken tai pinta-ala ei ole luku)
IOException - jos tiedoston käsittelyssä ilmeni muita ongelmia (esim. tiedostoa
ei ole olemassa tai siihen ei ole lukuoikeuksia)
-------------------------------------------------------*/
public Huoneisto lue()
throws KelvotonHuoneistotiedosto,
IOException {
lukuMerkkivirta = new FileReader(tiedostopolku);
puskuroituLukuVirta = new BufferedReader(lukuMerkkivirta);
// tässä pitäis lukea() tiedostoon juuri kirjoita metodilla kirjoitetut rivit
// tai kokonainen olio, jos se on mahdollista.
// lopuksi palauttaa koko huoneistoOlio, mutta miten?
String luettuRivi = puskuroituLukuVirta.readLine();
puskuroituLukuVirta.close();
lukuMerkkivirta.close();
}
}
[/code]
Vastaukset 1
Vanhimmat
Oletkos ajatellut käyttää Java Serialization-rajapintaa homman hoitamiseen? Se meinaan tarjoaa valmiin tavan olion tietojen tallentamiseen/lukemiseen kovalevylle/kovalevyltä. Nyt sä olet meinaan tekemässä jotakin, jonka Java tarjoaa jo valmiiksi tehtynä testattuna, käytä sitä ihmeessä hyvä tyttö!
Tällä tavalla toimittuna sun ei tarvii murehtia pätkääkään esim. noista tietotyypeistä, koska cast:aaminen huolehtii olion palauttamisesta - Ohessa Java Tutoriaalista kopioimani ja hieman muokkaamani esimerkki:
//kirjoitus
FileOutputStream out = new FileOutputStream("theFile");
ObjectOutputStream s = new ObjectOutputStream(out);
s.writeObject(huoneisto);
s.flush();
...
//lukeminen
FileInputStream in = new FileInputStream("theFile");
ObjectInputStream s = new ObjectInputStream(in);
Huoneisto huoneisto = (Huoneisto)s.readObject();
...
return huoneisto;
Eiks näytäkkin aika simppeliltä? - Ja parasta tässä on se, että nyt sä voit palauttaa return:lla olion aivan normaalisti, jolloin kepulikonsteja ei tarvitse käyttää.
Tähän Serialization hommaan liittyy kuitenkin versio-kriittisyys, joka saattaa vaikeuttaa myöhemmin muutosten tekemistä tuohon Huoneisto-luokkaan. Vielä nyt sun ei tartte tästä niin kauheasti murehtia, mutta pidä mielessä/lue joskus Java Standard Dokumentaatiosta kohta "Serialization and Evolution", jossa neuvotaan tulevaisuuden muutosten kanssa elämisestä.
-Jonttu-
PS. Muista, että Huoneisto-luokkan pitää toteuttaa Serialization rajapinta (implements Serializable), jotta homma rulaa.