komplikované zapisovanie do súboru

Programovacie jazyky, rady, poradňa...
macher1
Light Expert
Light Expert
Používateľov profilový obrázok
Príspevky: 38
Registrovaný: 07 jún 2011, 19:36

komplikované zapisovanie do súboru

Príspevok od používateľa macher1 »

Zdravím

Chcem spraviť program, ktorý bude obsahovať ArrayList, ktorý naplním dielami, a obsah tohto ArrayListu zapísať do súboru. Chcem tiež, aby bolo možné po spustení programu načítať údaje zo súboru.

Mám abstraktnú triedu Dielo, od ktorej je zdedených niekoľko tried.
Potom mám hlavnú triedu Kniznica s metódou main.
Ďalej mám triedu UlozenieDoArrayListu, v ktorej mám ArrayList typu Dielo, a do neho si ukladám inštancie jednotlivých diel - kniha, časopis atď. Toto sa deje už v konštruktore.
Mám tiež triedu Generator, ktorá má metódy na generovanie mien, názvov a obsahov kníh (a ďalších diel).
Problém je so zapisovaním a načítavaním zo súboru. Keď spustím hlavnú metódu v tr. Kniznica, a pozriem sa do súboru subor.txt, je tam vygenerovaný nejaký slovný reťazec a jeden zo žánrov, napr. slovo HOROR (žánre sú uložené v Enume, ale to nie je také podstatné).

Chcem to spraviť tak, aby mi obsah ArrayListu zapísalo do súboru, a potom, aby bolo možné ArrayList opäť naplniť položkami v súbore. A chcem aby mi do toho súboru generovalo toho toľko, koľko je uvedené v konštruktore triedy UlozenieDoArrayListu (je tam na to príkaz while).

PS - chyby sa pravdepodobne nachádzajú v metódach na zapisovanie a načítavanie.

Obrovská vďaka všetkým!

Zdrojáky:

Dielo

Kód: Vybrať všetko

public abstract class Dielo {
    
    private String nazov;
    private Enum zaner;
    private String jazyk;
    private Date datumVydania;
    private String vydavatelstvo;
    private String popis;
        
    public abstract Object getObsah();
    public void Zapis(DataOutputStream os) throws IOException{
        os.writeUTF(nazov);
        os.writeUTF(zaner.toString());
        os.writeUTF(jazyk);
        os.writeUTF(datumVydania.toString());
        os.writeUTF(vydavatelstvo);
        os.writeUTF(popis);
    }
    
    public void Nacitaj(DataInputStream is) throws IOException{//public DataInputStream
        String s = is.readUTF();
    }
    
    
    public final String dajVseobecnyPopis(){
        return popis;
    }
    
    public String getNazov(){
        return nazov;
    }
    public Enum getZaner(){
        return zaner;
    }
    public String getJazyk(){
        return jazyk;
    }
    public Date getDatum(){
        return datumVydania;
    }
    public String getVydavatelstvo(){
        return vydavatelstvo;
    }
    
    public void setNazov(String n){
        nazov = n;
    }
    public void setZaner(Enum z){
        zaner = z;
    }
    public void setJazyk(String j){
        jazyk=j;
    }
    public void setDatum(Date d){
        datumVydania = d;
    }
    public void setVydavatelstvo(String v){
        vydavatelstvo = v;
    }

    @Override
    public String toString() {
        return super.toString();
    }
    
    
}
UlozenieDoArrayListu

Kód: Vybrať všetko

public class UlozenieDoArrayListu implements Serializable{
        public Random rn = new Random();
        public ArrayList<Dielo>list;
        
        public UlozenieDoArrayListu(){
            this.list = new ArrayList<Dielo>();
            Generator g = new Generator();
            int i = 0;
            while(i<10){
            String st = g.generujSlovo(8);
            String nazov = st.substring(0,1).toUpperCase()+st.substring(1);
            String autor = g.generujMenoPriezvisko();
            String obsah = g.generujVetu();
            String ed = g.generujSlovo(10);
            String vyd = ed.substring(0,1).toUpperCase()+ed.substring(1);
            AudioVideo av = new AudioVideo();//inst triedy AudioVideo
            av.setNazov(nazov);
            av.setDatum(new Date());
            av.setVydavatelstvo(vyd);
            av.setZaner(Zaner.HOROR);
            Kniha kn = new Kniha();//inst triedy Kniha
            kn.setJazyk("tibetsky");
            kn.setAutor(autor);
            kn.setObsah(obsah);
            kn.setZaner(Zaner.SCIFI);
            kn.setISBN(st.toUpperCase());
            Publikacia pb = new Publikacia();//ins triedy Publikacia
            pb.setNazov(nazov);
            pb.setObsah(obsah);
            pb.setVydavatelstvo(st);
            pb.setDatum(new Date());
            Casopis cas = new Casopis();//inst triedy Casopis        
            cas.setJazyk("tibetan");
            cas.setNazov(st);
            cas.setObsah(st);
            cas.setVydavatelstvo(vyd);        
            list.add(av);//audiovideo
            list.add(kn);//kniha
            list.add(pb);//publikacia
            list.add(cas);//casopis
            i++;
          }
      }       
Hlavná trieda

Kód: Vybrať všetko

public class Kniznica implements Serializable {

    public static void main(String[] args) {

        UlozenieDoArrayListu uk = new UlozenieDoArrayListu();
        
        DataOutputStream dos = null;
        try {
            dos = new DataOutputStream(new FileOutputStream("subor.txt"));
            for (Dielo dielo : uk.list) {
                dielo.Zapis(dos);
                
            }
        } catch (Exception ex) {
            System.out.println("" + ex.getMessage());
        }finally{
            try{
            if(dos!=null)
                dos.close();
            }catch(Exception ex){
                System.out.println(""+ex.getMessage());
            }
        }
}
Pridávam ešte pár tried jednotlivých diel

AudioVideo

Kód: Vybrať všetko

public class AudioVideo extends Dielo implements Serializable{
    
    private String obsah;
    
    public void setObsah(String o){
        obsah = o;
    }

    @Override
    public String getObsah() {
        return obsah;
    }

    @Override
        public void Zapis(DataOutputStream s) throws IOException{
        super.Zapis(s);
        s.writeUTF(obsah);
    }


    @Override
        public void Nacitaj(DataInputStream is) throws IOException {
        super.Nacitaj(is);
    }
}
Casopis

Kód: Vybrať všetko

public class Casopis extends Dielo implements Serializable{
    
    private String obsah;
    
    public String getObsah(){
        return obsah;
    }
    public void setObsah(String o){
        obsah = o;
    }
    public String toString(){
        return super.toString() + " " + obsah;
    }

    @Override
    public void Zapis(DataOutputStream s) throws IOException{
        super.Zapis(s);
        s.writeUTF(obsah);
    }
        
}
mirak2
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6719
Registrovaný: 18 sep 2005, 13:44
Bydlisko: Prague, CZE / Kosice, SVK

Re: komplikované zapisovanie do súboru

Príspevok od používateľa mirak2 »

cely ten tvoj kod je horor, od navrhu cez zapis az po upravu. vies debugovat? ak nevies, je najvyssi cas sa to naucit. nastav si debug point na riadok dielo.Zapis(uk) a pusti debug... a preklikavaj sa riadok po riadku a pozeraj, v akom stave mas objekty, co v nich mas a co sa z nich vlastne vypisuje. toto analyzovat je peklo.
macher1
Light Expert
Light Expert
Používateľov profilový obrázok
Príspevky: 38
Registrovaný: 07 jún 2011, 19:36

Re: komplikované zapisovanie do súboru

Príspevok od používateľa macher1 »

ok skúsim to. vďaka za radu :)
Napísať odpoveď