70 likes | 177 Views
Näide. Tekstifaili kopeerimine. import java.io.*;. Failide nimede määramine konstantidena: 1) absoluutne tee + faili nimi (täisnimena) String sf Nimi = "C:\ATIkasutaja\Kiho\OOP2009\Praktikum\praktikum7\ a .txt"; // väljundfaili nimi
E N D
Näide. Tekstifaili kopeerimine import java.io.*; Failide nimede määramine konstantidena: 1) absoluutne tee + faili nimi (täisnimena) String sfNimi = "C:\\ATIkasutaja\\Kiho\\OOP2009\\Praktikum\\praktikum7\\a.txt"; // väljundfaili nimi String vfNimi = "C:\\ATIkasutaja\\Kiho\\OOP2009\\Praktikum\\praktikum7\\b.txt"; // sisendfaili nimi või 2) suhteline tee + faili nimi String sfNimi = ".\\praktikum7\\a.txt"; // alguspunktile vastab tee System.getProperty("user.dir") String vfNimi = ".\\praktikum7\\b.txt"; // alguspunktile vastab tee System.getProperty("user.dir") Kopeerida read failist sfNimi faili vfNimi: try{ BufferedReader sfail = new BufferedReader(new FileReader(sfNimi )); // avada sisestamiseks BufferedWriter vfail = new BufferedWriter(new FileWriter(vfNimi )); // avada väljastamiseks String r = ""; // loetava rea (ilma realõpu sümboli(te)ta) koht while((r = sfail.readLine()) != null){ // r := jrk rida sisendfailist, ja kui see ei ole null, siis vfail.write(r); // kirjutada r väljundfaili vfail.newLine(); // lisada veel realõpu sümbol(id) } sfail.close(); vfail.close(); } catch (IOException e){ System.err.println(e); } sfail.readLine() tagastab järjekordse sisestatud rea või tühiviida null, kui rohkem ridu enam ei ole
Näide. Faili nime määramine brauseri abil import javax.swing.*; // JFileChooser . . . public static String validaFail(String viip){ JFileChooser fc = new JFileChooser(System.getProperty("user.dir") + "\\praktikum7"); fc.showDialog(null, viip); return fc.getSelectedFile().getAbsolutePath(); // valitud faili nimi või NullPointerException } Selgitusi: JFileChooser fc = new JFileChooser(Kaust); Kaust -- millest alustada. Võib puududa, siis alguskausta määrab süsteem, nt ..... My Documents vmt. fc.showDialog(null, viip); Brauseri (kaustade sirvija) aken ekraanile. Esimene argument – ülemus-aken (kui on, muidu null). Teine argument – “jah”-vastuse nupu tekst, vt jrgm slaid. Kui kasutaja vastas, siis tagastatakse int-arv (siin seda arvu ei kasutata). Ja suletakse aken. Üldisem: int tulem = fc.showDialog(null, viip); if(tulem == JFileChooser.APPROVE_OPTION) … Klassi java.lang.File isend (kasutaja poolt valitud fail). See on null, kui faili ei valitud (vajutati Cancel või suleti dialoogiaken). Viimasel juhul seega tekib erind NullPointerException, kui isendist soovitakse saada valitud faili nime: fc.getSelectedFile() fc.getSelectedFile().getAbsolutePath()
Faili ümberkirjutamise tarkvarakomponent public class FailistFaili{ public static boolean ülekanne(Reameister rm) avada sisendfail avada väljundfail sisendfaili iga rea r korral leida vastavate uute ridade järjend leitud uued read kirjutada väljundfaili igasuguse tõrke korral tagastatakse false, muidu true Liides Reameister public interface Reameister public String sisendfailiNimi(); public String väljundfailiNimi(); public String[] teisendus(String rida); Selle tarkvarakomponendi rakenduskokkulepe: 1. Kirjutada klass (nt klass ReameisterX), mis realiseerib (implements) liidese Reameister; st klassis ReameisterX peavad leiduma liideses loetletud kolm meetodit (failinimede hankimiseks ja järjekordse sisendrea teisendamiseks 0 või enamaks väljundreaks). 2. Faili ümberkirjutamiseks rakendada klassi FailistFaili meetodit ülekanne andes argumendiks klassi ReameisterX isendi, nt FailistFaili.ülekanne(new ReameisterX());
Reameistrite näiteid Kopeerimine Tühjade ridadeta, lisatakse reanumbrid package praktikum7; public class Reameister_Kopeerija implements Reameister{ private String sfNimi; private String vfNimi; public Reameister_Kopeerija(){ sfNimi = Praktikum7.validaFail("Sisendfail"); vfNimi = Praktikum7.validaFail("Väljundfail"); } public String[] teisendus(String r){ // lihtsalt kopeerida (tagastada sama r), 1 elem return new String[]{r}; } public String sisendfailiNimi(){ return sfNimi; } public String väljundfailiNimi(){ return vfNimi; } } package praktikum7; public class Reameister_Koond_Numbrid implements Reameister{ private int i = 0; private String sfNimi; private String vfNimi; public Reameister_Koond_Numbrid(){ sfNimi = Praktikum7.validaFail("Sisendfail"); vfNimi = Praktikum7.validaFail("Väljundfail"); } public String[] teisendus(String r){ // kui pole tühi, siis tagastada number.+r (1 elem) if(r.trim().length() > 0) return new String[]{(++i) +". " + r}; else return new String[0]; // 0 elementi } public String sisendfailiNimi(){ return sfNimi; } public String väljundfailiNimi(){ return vfNimi; } }
Klassi FailistFaili.java näidisskeem • package praktikum7; • import java.io.*; • public class FailistFaili{ • public static boolean ülekanne(Reameister rm){ • try{ • System.out.println("FailistFaili(" + rm.getClass().getName() + "):"); • String sfNimi = rm.sisendfailiNimi(); • String vfNimi = rm.väljundfailiNimi(); • System.out.println(" " + sfNimi + " ==>\n==> " + vfNimi); • if(sfNimi.equals(vfNimi)){ • System.out.println("Sisend- ja valjundfail peavad olema erinevad!"); • return false; • } • //(vt ka slaid 1 -- Tekstifaili kopeerimine) • //failide avamine, • // rea sisestamine sisendfailist, • // uute ridade loomine (rm.teisendus abil) • // ja nende kirjutamine väljundfaili, • //failide sulgemine • return true; • } • catch (IOException e{ • System.err.println(e.getMessage()); • return false; • } • catch (NullPointerException e) { // <-- faili nimi jäi valimata • System.err.println("Faili nimi valimata!"); • return false; • } • } • } Klassi nimi, mille isendiks rm on
Peaklassi Praktikum7.java näidisskeem package praktikum7; import javax.swing.*;// JFileChooser public class Praktikum7 { public static void main(String[] args){ boolean tehtud = FailistFaili.ülekanne(new ReameisterX()); System.out.println(tehtud ? "Tehtud." : "Tegemata!"); } public static String validaFail(String viip){ // Vt slaid 2 } }