/** * @(#)Tallentaja.java * Tallentaja on luokka, jonka oliolle annetaan * lauma Tallennettava-rajapinnan toteuttavia olioita ArrayList:inä. * Tallentaja tallentaa oliot niiden toTiedosto toteutuksen * perusteella tekstitiedostoon. * Lukurutiinia kutsuttaessa Tallentaja luo oliot uudelleen * tallennetun tiedon perusteella ja palauttaa ne ArrayListinä. * * toTiedosto toteutuksen on palautettava olion sisältämät * tiedot siinä järjestyksessä, kuin luokasta löytyvä * konstruktori argumentteinaan edellyttää. Vain String, * int ja double ovat toistaiseksi sallittuja tietotyyppejä. * * * @author Pauli Räinä * @version 2.00 2008/3/17 Shuffle-edit. */ import java.lang.reflect.*; import java.util.*; import java.io.*; public class Tallentaja { /** Polku käytettävään tiedostoon. */ private String kohde; /** Lukuolio */ private BufferedReader luku; /** Kirjoitusolio */ private PrintWriter kirj; /** Konstuktori, joka käyttää suorituspolussa olevaa * Tallennus-tiedostoa. */ public Tallentaja() { kohde = "./Tallennus"; init(); } /** Konstuktori, joka käyttää argumenttina saatavassa * polussa sijaitsevaa tiedostoa. */ public Tallentaja(String kohde) { this.kohde = kohde; init(); } /** Luodaan tiedosto, jos sitä ei ole * AE: true */ private void init() { File tied = new File(kohde); if (!tied.exists()) { try { tied.createNewFile(); } catch (Exception e) {} } } /** Tallennusrutiini *AE: tiedostot.size() > 0; */ public void tallenna(ArrayList tiedostot) { try { kirj = new PrintWriter(new FileWriter(kohde),true); Iterator iter = tiedostot.iterator(); while (iter.hasNext()) { Tallennettava talolio = iter.next(); String tyyppi = talolio.annaLuokka(); ArrayList t = talolio.toTiedosto(); String rivi = tyyppi; for (int i = 0; i < t.size(); i++) { rivi = rivi + ";" + t.get(i); } kirj.println(rivi); } kirj.close(); } catch (Exception e) { } } /** Lukurutiini kohdeargumentilla. * Palauttaa tyhjän ArrayList:in, jos tietoja ei pystytä lukemaan * AE: true */ public ArrayList lue(String kohde) { this.kohde = kohde; return lue(); } /** Lukurutiini * Palauttaa tyhjän ArrayList:in, jos tietoja ei pystytä lukemaan * AE: true **/ public ArrayList lue() { ArrayList valmiit = new ArrayList(); try { luku = new BufferedReader(new FileReader(kohde)); String rivi = luku.readLine(); while (!(rivi == null)) { String[] tiedot = rivi.split(";"); ArrayList args = new ArrayList(); // Konvertoidaan tiedot[] (pl. tiedot[0]) -> // ArrayList args for (int i = 1; i < tiedot.length; i++) { // Onko int? try { args.add(Integer.parseInt(tiedot[i])); } catch (NumberFormatException nfe) { // Ei ole int, onko double? try { args.add(Double.parseDouble(tiedot[i])); } catch (NumberFormatException nfe2) { //ei ole int, täytyy olla String. args.add(tiedot[i]); } } } for (int i = 0; i < args.size(); i++) { System.out.println(args.get(i)); } // END konvertointi // luodaan kyseinen olio, tyyppiä tiedot[0] // argumentilla ArrayList args. try { String name = tiedot[0]; // Haetaan Stringille luokka Class cl = Class.forName(name); // Haetaan konstruktori parametrilla java.lang.reflect.Constructor constructor = cl.getConstructor (new Class[] {ArrayList.class}); // Luodaan olio Object obj = constructor.newInstance (new Object[]{args}); valmiit.add((Tallennettava)obj); } catch (Exception e) { System.out.println("Tallentaja: Olion luonti failasi luettaessa"); } // END luonti rivi = luku.readLine(); } luku.close(); } catch (Exception e) { } return valmiit; } }