Ukladanie do súboru + dedenie + čítanie zo súboru – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Ukladanie do súboru + dedenie + čítanie zo súboru – Java – Fórum – Programujte.comUkladanie do súboru + dedenie + čítanie zo súboru – Java – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
marek
~ Anonymní uživatel
474 příspěvků
18. 4. 2013   #1
-
0
-

Dobrý deň

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

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

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

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

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

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);
    }
        
}
Nahlásit jako SPAM
IP: 158.193.83.–
Reklama
Reklama
sleepy0
Stálý člen
19. 4. 2013   #2
-
0
-

Za prve neviem preco si si daval tu namahu a robil si class Dielo abstraktne a potom si vytvoril nove class-i, ktore dedili z Diela aj ked obe su uplne rovnake. Toto rob az ked naozaj ten class o niec rozsiris a to uz nebudes len takto zapisovat. A obsah v hociakom inom zdedenom classe bude znova len String, alebo sa mylim? Druha vec, zbytocne serializujes ak to nebudes ukladat ako objekt. Nakoniec je dobre veci splachnut ked zapisujes, cize flush(). Tu som napisal nieco co funguje:

 Diela.java

import java.util.Calendar;
import java.util.GregorianCalendar;

class Dielo{
	private String autor, nazov, vydavatelstvo, obsah;
	private Calendar datumVydania;
	
	public Dielo(){
		this("", "", "", "", new GregorianCalendar());
	}
	
	public Dielo(String autor, String nazov, String vydavatelstvo, String obsah, Calendar datumVydania){
		this.autor = autor;
		this.nazov = nazov;
		this.vydavatelstvo = vydavatelstvo;
		this.obsah = obsah;
		this.datumVydania = datumVydania;
	}
	
	public void setAutor(String autor){
		this.autor = autor;
	}
	
	public void setNazov(String nazov){
		this.nazov = nazov;
	}
	
	public void setObsah(String obsah){
		this.obsah = obsah;
	}
	
	public void setVydavatelstvo(String vydavatelstvo){
		this.vydavatelstvo = vydavatelstvo;
	}
	
	public void setDatumVydania(Calendar datumVydania){
		this.datumVydania = datumVydania;
	}
	
	public String getAutor(){
		return autor;
	}
	
	public String getNazov(){
		return nazov;
	}
	
	public String getVydavatelstvo(){
		return vydavatelstvo;
	}
	
	public String getObsah(){
		return obsah;
	}
	
	public Calendar getDatumVydania(){
		return datumVydania;
	}
}

Kniznica.java

import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.PrintWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.text.SimpleDateFormat;


class Kniznica{
	private ArrayList<Dielo> kniznica;
	
	public Kniznica(){
		kniznica = new ArrayList<Dielo>();
	}
	
	public void vlozDielo(Dielo dielo){
		kniznica.add(dielo);
	}
	
	public void vlozDiela(Dielo[] diela){
		for(Dielo d: diela)
			kniznica.add(d);
	}
	
	public void zmazDielo(int index){
		kniznica.remove(index);
	}
	
	public void zmazDielo(Dielo dielo){
		kniznica.remove(dielo);
	}
	
	public Dielo getDielo(int index){
		return kniznica.get(index);
	}
	
	public void zapisDoSuboru(String nazovSuboru){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
		try{
			PrintWriter pw = new PrintWriter( new BufferedWriter( new FileWriter(nazovSuboru) ) );
			for(Dielo dielo : kniznica){
				pw.println(dielo.getNazov());
				pw.println(dielo.getAutor());
				pw.println(dielo.getVydavatelstvo());
				pw.println(sdf.format(dielo.getDatumVydania().getTime()));
				pw.println(dielo.getObsah());
				pw.println();
				pw.flush();
			}
			pw.close();
		}
		catch(IOException ioe){
			System.err.println(ioe);
		}
	}

public static void main(String[] arg){
		Kniznica k = new Kniznica();
		Dielo d[] = {
			new Dielo("Kolmogorov, Fomin", "Zaklady teorie funkcii a funkcionalnej analyzy", "NechceSaMiHladat", "teoria mnozin, teoria miery, MP a TP, topologia, funkcionalna analyza, etc...", new GregorianCalendar(1972,0,1)),
			new Dielo("Kluvanek, Misik, Svec", "Matematika 1", "SVTL", "Uvod do diferencialneho a integralneho poctu", new GregorianCalendar(1956,0,1)),
			new Dielo("Kluvanek, Misik, Svec", "Matematika 2", "SVTL", "Nekonecne rady, Funkcionalne rady, Mocninne rady, Fourierove rady, Diferencialne rovnice, Viacrozmerne a Krivkove integraly, Teoria funkcii komplexnej premennej", new GregorianCalendar(1961,0,1))
		};
		k.vlozDiela(d);
		k.zapisDoSuboru("literatura.txt");
	}
}

Citat budes obdobne pomocou FileReader-u, BufferedReader-u, InputStreamReaderu a FileInputStream-u. Najdi si v API ako sa to pouziva. Uvedom si ze to mas zapisane v urcitom poradi, v tomto poradi musis aj citat.

Nahlásit jako SPAM
IP: 158.195.204.–
marek
~ Anonymní uživatel
474 příspěvků
21. 4. 2013   #3
-
0
-

skúsim to, ale ešte tam čosi prerobím. ale dosť si mi s tým pomohol. díky moc! :)

Nahlásit jako SPAM
IP: 158.193.83.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 38 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý