Zdrojový kód z prednášky 23.11.2011

Trieda Film (súbor Film.java).

import java.io.PrintWriter;
import java.util.Scanner;

public class Film {
        private String nazovFilmu = "";
        private String[] herci;
        private String[] zanre;
        private int dlzkaFilmu;
        private double hodnotenie;

        /*
         * konštruktor bez parametrov - je potrebné ho napísať, ak ho chceme používať,
         * lebo sa negeneruje implicitný, ak už nejaký konštruktor v triede je
         */

        public Film() {

        }

        public Film(String nazovFilmu, String[] herci, String[] zanre,
                        int dlzkaFilmu, double hodnotenie) {
                setNazovFilmu(nazovFilmu);
                this.herci = herci;
                this.zanre = zanre;
                setDlzkaFilmu(dlzkaFilmu);
                this.hodnotenie = hodnotenie;
        }

        // toto sa nikdy nevykoná, lebo používame iba oddedené triedy
        public String dajUmiestnenie() {
                return "Toto vratil objekt triedy Film a nie objekt triedy z neho oddenenej";
        }

        // metóda vypíše všetky informácie o filme vrátane informácie o médiu,
        // lebo sa plánuje iba volanie z objektov oddedených tried
        public String toString() {
                StringBuilder sb = new StringBuilder();
                sb.append(nazovFilmu+ "\n");
                sb.append("dlzka filmu je "+ dlzkaFilmu + "\n");
                sb.append("hodnotenie:" + hodnotenie + "\n");
                sb.append("Herci: ");
                for (int i = 0; i < herci.length; i++) {
                        sb.append(herci[i]+",");
                }
                sb.append("\nZanre: ");
                for (int i = 0; i < zanre.length; i++) {
                        sb.append(zanre[i]+",");
                }
                sb.append("\n");
                // bude sa volať prekryté dajUmiestnenie z objektov oddedených tried
                sb.append(dajUmiestnenie());
                return sb.toString();
        }

        // uloží cez PrintWriter do súboru informácie o filme (nie o umiestnení)
        // táto metóda by sa nemala volať z cudzieho kódu, ale len z metód ulozSa
        // oddedených tried, ktoré zabezpečia výpis špecifických informácií okolo tohoto výpisu
        public void ulozSa(PrintWriter pw) {
                pw.println(nazovFilmu);
                pw.println(herci.length);
                for (int i = 0; i < herci.length; i++) {
                        pw.println(herci[i]);
                }
                pw.println(zanre.length);
                for (int i = 0; i < zanre.length; i++) {
                        pw.println(zanre[i]);
                }
                pw.println(dlzkaFilmu);
                pw.println(hodnotenie);
        }

        // načíta cez Scanner zo súboru informácie o filme (nie o umiestnení)
        // táto metóda by sa nemala volať z cudzieho kódu, ale len z konštruktorov
        // oddedených tried, ktoré zabezpečia načítanie špecifických informácií okolo tohoto načítania
        public void nacitajFilm(Scanner citac) {
                nazovFilmu = citac.nextLine();
                herci = new String[citac.nextInt()];
                citac.nextLine();
                for (int i = 0; i < herci.length; i++) {
                        herci[i] = citac.nextLine();
                }
                zanre = new String[citac.nextInt()];
                citac.nextLine();
                for (int i = 0; i < zanre.length; i++) {
                        zanre[i] = citac.nextLine();
                }
                dlzkaFilmu = citac.nextInt();
                citac.nextLine();
                hodnotenie = citac.nextDouble();
                citac.nextLine();
        }

        public boolean mamZaner(String zaner) {
                for (int i = 0; i < zanre.length; i++) {
                        if (zaner.equals(zanre[i])) {
                                return true;
                        }
                }
                return false;
        }

        public void setNazovFilmu(String nazovFilmu) {
                if (nazovFilmu != null)
                        this.nazovFilmu = nazovFilmu;
        }

        public void setDlzkaFilmu(int dlzkaFilmu) {
                if (dlzkaFilmu < 0)
                        dlzkaFilmu = 0;
                this.dlzkaFilmu = dlzkaFilmu;
        }

        public String getNazovFilmu() {
                return nazovFilmu;
        }

        public String[] getHerci() {
                return herci;
        }

        public void setHerci(String[] herci) {
                this.herci = herci;
        }

        public String[] getZanre() {
                return zanre;
        }

        public void setZanre(String[] zanre) {
                this.zanre = zanre;
        }

        public double getHodnotenie() {
                return hodnotenie;
        }

        public void setHodnotenie(double hodnotenie) {
                this.hodnotenie = hodnotenie;
        }

        public int getDlzkaFilmu() {
                return dlzkaFilmu;
        }
}

Trieda FilmNaDvd (súbor FilmNaDvd.java).

import java.io.PrintWriter;
import java.util.Scanner;

public class FilmNaDvd extends Film {

        private int cisloDvd;

        // všetky inštančné premenné treba nastaviť cez settery
        public FilmNaDvd() {
        }

        // načíta cez Scanner zo súboru informácie o Dvd filme.
        // Najprv spracuje informácie o filme zavolaním rodičovskej metódy nacitajFilm
        // a potom dočíta ešte špecifiké dáta pre toto médium
        public FilmNaDvd(Scanner citac) {
                nacitajFilm(citac);
                cisloDvd = citac.nextInt();
                citac.nextLine();
                citac.nextLine();
        }

        public void setCisloDvd(int cisloDvd) {
                this.cisloDvd = cisloDvd;
        }

        // táto metóda je typicky volaná z metódy toString oddedenej z triedy Film
        // ale dá sa použiť aj priamo
        public String dajUmiestnenie() {
                return "DVD číslo " + cisloDvd;
        }

        // uloží cez PrintWriter do súboru informácie o Dvd filme
        // najprv zaznamená typ média, potom zapíše informácie o filme zavolaním rodičovskej
        // triedy ulozSa a nakoniec dopíše dáta špecifické pre toto médium
        public void ulozSa(PrintWriter pw) {
                pw.println("dvd");
                super.ulozSa(pw);
                pw.println(cisloDvd);
                pw.println();
        }       
}

Trieda FilmNaPaske (súbor FilmNaPaske.java).

import java.io.PrintWriter;
import java.util.Scanner;

public class FilmNaPaske extends Film {

        private int cisloPasky;
        private int zaciatok;

        // tento konštruktor nastaví iba inštančné premenné zdedené od triedy Film
        // premenné cisloPasky a zaciatok treba nastavit cez settery
        public FilmNaPaske(String nazovFilmu, String[] herci, String[] zanre,
                        int dlzkaFilmu, double hodnotenie) {   
                super(nazovFilmu, herci, zanre, dlzkaFilmu, hodnotenie);
        }

        // načíta cez Scanner zo súboru informácie o filme na páske.
        // Najprv spracuje informácie o filme zavolaním rodičovskej metódy nacitajFilm
        // a potom dočíta ešte špecifiké dáta pre toto médium
        public FilmNaPaske(Scanner citac) {
                nacitajFilm(citac);
                cisloPasky = citac.nextInt();
                citac.nextLine();
                zaciatok = citac.nextInt();
                citac.nextLine();
                citac.nextLine();
        }

        // uloží cez PrintWriter do súboru informácie o filme na páske
        // najprv zaznamená typ média, potom zapíše informácie o filme zavolaním rodičovskej
        // triedy ulozSa a nakoniec dopíše dáta špecifické pre toto médium
        public void ulozSa(PrintWriter pw) {
                pw.println("paska");
                super.ulozSa(pw);
                pw.println(cisloPasky);
                pw.println(zaciatok);
                pw.println();
        }

        // táto metóda je typicky volaná z metódy toString oddedenej z triedy Film
        // ale dá sa použiť aj priamo
        public String dajUmiestnenie() {
                return "Páska číslo " + cisloPasky + " od "+ zaciatok +". minúty";
        }

        public void setCisloPasky(int cisloPasky) {
                this.cisloPasky = cisloPasky;
        }

        public void setZaciatok(int zaciatok) {
                this.zaciatok = zaciatok;
        }
}

Trieda FilmVPocitaci (súbor FilmVPocitaci.java).

import java.io.PrintWriter;
import java.util.Scanner;


public class FilmVPocitaci extends Film {

        private String nazovPocitaca;
        private String cestaKSuboru;
        private int velkostSuboru;

        // tento konštruktor nastaví všetky inštančné premenné
        public FilmVPocitaci(String nazovFilmu, String[] herci, String[] zanre,
                        int dlzkaFilmu, double hodnotenie, String nazovPocitaca,
                        String cestaKSuboru, int velkostSuboru) {
                super(nazovFilmu, herci, zanre, dlzkaFilmu, hodnotenie);
                this.nazovPocitaca = nazovPocitaca;
                this.cestaKSuboru = cestaKSuboru;
                this.velkostSuboru = velkostSuboru;
        }

        // načíta cez Scanner zo súboru informácie o filme v počítači.
        // Najprv spracuje informácie o filme zavolaním rodičovskej metódy nacitajFilm
        // a potom dočíta ešte špecifiké dáta pre toto médium
        public FilmVPocitaci(Scanner citac) {
                nacitajFilm(citac);
                nazovPocitaca = citac.nextLine();
                cestaKSuboru = citac.nextLine();
                velkostSuboru = citac.nextInt();
                citac.nextLine();
                citac.nextLine();
        }

        // táto metóda je typicky volaná z metódy toString oddedenej z triedy Film
        // ale dá sa použiť aj priamo
        public String dajUmiestnenie() {
                return "Počítač " + nazovPocitaca+ " v súbore "+ cestaKSuboru;
        }

        // uloží cez PrintWriter do súboru informácie o filme na páske
        // najprv zaznamená typ média, potom zapíše informácie o filme zavolaním rodičovskej
        // triedy ulozSa a nakoniec dopíše dáta špecifické pre toto médium
        public void ulozSa(PrintWriter pw) {
                pw.println("pc");
                super.ulozSa(pw);
                pw.println(nazovPocitaca);
                pw.println(cestaKSuboru);
                pw.println(velkostSuboru);
                pw.println();
        }

        public int getVelkostSuboru() {
                return velkostSuboru;
        }
}

Trieda ZoznamFilmov (súbor ZoznamFilmov.java).

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;

public class ZoznamFilmov {

        private Film[] filmy;

        public ZoznamFilmov() {
                filmy = new Film[0];
        }

        public void vlozNovyFilm(Film dvd) {
                Film[] novePole = new Film[filmy.length+1];
                System.arraycopy(filmy, 0, novePole, 0, filmy.length);
                novePole[filmy.length] = dvd;
                filmy = novePole;
        }

        public void vypisVsetko() {
                for (int i = 0; i < filmy.length; i++) {
                        System.out.println(filmy[i].toString());
                }
        }

        public void vypisPodlaZanru(String zaner) {
                for (int i = 0; i < filmy.length; i++) {
                        if (filmy[i].mamZaner(zaner)) {
                                System.out.println(filmy[i]);
                                System.out.println("=====================");
                        }
                }              
        }

        public void vymazFilm(Film dvd) {
                Film[] novePole = new Film[filmy.length-1];
                int pozicia = 0;
                while(filmy[pozicia] != dvd) {
                        if (pozicia == novePole.length) {
                                return;
                        }
                        novePole[pozicia] = filmy[pozicia];
                        pozicia++;
                }
                for(int i = pozicia+1; i < filmy.length; i++) {
                        novePole[i-1] = filmy[i];
                }
                filmy = novePole;
        }

        public void vymazFilm(String nazovFilmu) {
                int pozicia = 0;
                while ((pozicia < filmy.length) && (! filmy[pozicia].getNazovFilmu().equals(nazovFilmu))) {
                        pozicia++;     
                }
                if ((pozicia < filmy.length))
                        vymazFilm(filmy[pozicia]);
        }

        // metóda uloží celý zoznam filmov do súboru,
        // každý film sa zapisuje sám
        public void ulozSa(String subor) {
                File f = new File(subor);
                PrintWriter pw = null;
                try {
                        pw = new PrintWriter(f);
                        pw.println(filmy.length);
                        for (int i = 0; i < filmy.length; i++) {
                                filmy[i].ulozSa(pw);
                        }                      
                } catch (FileNotFoundException e) {
                        System.err.println("Subor neviem vyrobit, neulozilo sa nic.");
                } finally {
                        if (pw != null) {
                                pw.close();
                        }
                }
        }

        // metóda načíta celý zoznam filmov zo súboru
        // každý film si prečíta hodnoty a naplní svoje inštančné premenné sám
        // cez príslušný konštruktor
        public void nacitajSa(String subor) {
                File f = new File(subor);
                Scanner citac = null;
                filmy = new Film[0];
                try {
                        citac = new Scanner(f);
                        int dlzkaDb = citac.nextInt();
                        citac.nextLine();
                        for (int i = 0; i < dlzkaDb; i++) {
                                String typMedia = citac.nextLine();
                                if (typMedia.equals("dvd")) {
                                        vlozNovyFilm(new FilmNaDvd(citac));
                                }
                                if (typMedia.equals("paska")) {
                                        vlozNovyFilm(new FilmNaPaske(citac));
                                }
                                if (typMedia.equals("pc")) {
                                        vlozNovyFilm(new FilmVPocitaci(citac));
                                }                              
                        }
                } catch (FileNotFoundException e) {
                        System.err.println("Subor neviem precitat, zoznam filmov je prazdny.");
                } finally {
                        if (citac != null) {
                                citac.close();
                        }
                }              
        }
}

Trieda Spustac (súbor Spustac.java).

/* Matrix:
 * Herci:               Keanu Reeves, Laurence Fishburne, Carrie-Anne Moss
 * Žánre:             Akčný, Sci-Fi
 * Hotnotenie:  8.7
 * Dĺžka:             136
 *
 * The Shawshank Redemption:
 * Herci:               Tim Robbins, Morgan Freeman
 * Žánre:             Dráma
 * Hotnotenie:  9.2
 * Dĺžka:             142
 *
 * Fontána pre Zuzanu: 
 * Herci:               Eva Vejmělková, Jiří Bábek, Robo Grigorov
 * Žánre:             Dráma, Romantika, Muzikál
 * Hotnotenie:  6.3
 * Dĺžka:             81
 *
 * Pacho, hybský zbojník:
 * Herci:               Jozef Kroner, Marián Labuda
 * Žánre:             Komédia
 * Hotnotenie:  8.5
 * Dĺžka:             91
 */


public class Spustac {

        public static void main(String[] args) {
                FilmNaDvd pacho = new FilmNaDvd();
                pacho.setNazovFilmu("Pacho, hybský zbojník");
                pacho.setHodnotenie(8.5);
                pacho.setDlzkaFilmu(91);
                String[] herci = {"Jozef Kroner", "Marián Labuda"};
                pacho.setHerci(herci);
                String[] zanre = {"Komédia"};
                pacho.setZanre(zanre);
                pacho.setCisloDvd(50);

                String[] herci2 = {"Eva Vejmělková", "Jiří Bábek", "Robo Grigorov"};
                String[] zanre2 = {"Dráma", "Romantika", "Muzikál"};
                FilmNaPaske fontana = new FilmNaPaske("Fontána pre Zuzanu", herci2, zanre2, 81, 6.3);
                fontana.setCisloPasky(2);
                fontana.setZaciatok(92);

                String[] herci3 = {"Tim Robbins", "Morgan Freeman"};
                String[] zanre3 = {"Dráma"};
                FilmVPocitaci shawshank = new FilmVPocitaci("The Shawshank Redemption", herci3, zanre3, 142, 9.2,"Jozko","C:\\filmy\\shawshank.avi",700);

                String[] herci4 = {"Keanu Reeves", "Laurence Fishburne", "Carrie-Anne Moss"};
                String[] zanre4 = {"Akčný", "Sci-Fi"};
                FilmNaPaske matrix = new FilmNaPaske("The Matrix", herci4, zanre4, 136, 8.7);
                matrix.setCisloPasky(20);
                matrix.setZaciatok(0);

                ZoznamFilmov zoznam = new ZoznamFilmov();
                zoznam.vlozNovyFilm(pacho);
                zoznam.vlozNovyFilm(fontana);
                zoznam.vlozNovyFilm(shawshank);
                zoznam.vlozNovyFilm(matrix);

                zoznam.ulozSa("naseFilmy.txt");
        }
}

Trieda SpustacZoSuboru (súbor SpustacZoSuboru.java).

public class SpustacZoSuboru {

        public static void main(String[] args) {
                ZoznamFilmov filmy = new ZoznamFilmov();
                filmy.nacitajSa("naseFilmy.txt");
                filmy.vypisVsetko();
        }

}

Súbor naseFilmy.txt

4
dvd
Pacho, hybský zbojník
2
Jozef Kroner
Marián Labuda
1
Komédia
91
8.5
50

paska
Fontána pre Zuzanu
3
Eva Vejmělková
Jiří Bábek
Robo Grigorov
3
Dráma
Romantika
Muzikál
81
6.3
2
92

pc
The Shawshank Redemption
2
Tim Robbins
Morgan Freeman
1
Dráma
142
9.2
Jozko
C:\filmy\shawshank.avi
700

paska
The Matrix
3
Keanu Reeves
Laurence Fishburne
Carrie-Anne Moss
2
Akčný
Sci-Fi
136
8.7
20
0