C 12 LPO Operatii de Intrarei Esire cu


















- Slides: 18
C 12 – LPO: Operatii de Intrare/i. Esire cu fisiere CUPRINS n n n Fisiere Fluxuri pe octet pe caracter Serializare Tokenizer (analiza lexicala)
Obiective După parcurgerea acestui curs ar trebuie sa puteţi: n înţelege principiile de lucru fisiere si fluxuri in Java; n manipula date prin fluxuri pe caracter si octer; n serializa obiecte prin fluxuri; n realiza analiza lexicala a datelor stocate in fisiere.
Fisiere Java n n fişierul este o structura de date ce asigura pastrarea permanenta (persistenta) datelor; datele sunt stocate utilizând doua formate: n n n text (caracter) : ‘a’ ‘b’ ‘ 1’ ‘ 2’ …. binar (octeti): 0 12 48 63 … în Java fişierele sunt fluxuri de caractere sau de octeti fluxul este abstractizarea pentru orice se poate citi sau scrie; clasele de fluxuri (Stream) se folosesc la manipularea de octeti, clasele Reader si Writer citesc si scriu caractere.
Fluxuri n n operatiile de intrare/ieşire pe fluxuri au la baza patru clase abstracte: Input. Stream, Output. Stream, Reader şi Writer; pe baza acestora se creeaza mai multe clase concrete, de aplicatiile opereaza cu clase concrete, cele abstracte definesc functonalitatea comuna tuturor claselor din acea categorie; Input. Stream şi Output. Stream se folosesc în cazul fluxurilor de octeti, iar Reader şi Writer se folosesc în cazul fluxurilor de caractere; fluxurile pe caracter se folosesc în cazul caracterelor şi a şirurilor de caractere, iar cele pe octet în cazul octetilor sau a obiectelor binare.
Fisiere externe si directori n n un obiect din clasa File se foloseste pentru manipularea de fisiere si directori (la nivelul sistemului de operare); crearea unui fisier extern si director se fac prin: File f = new File(“nume. txt”); f. create. New. File(); n stergerea unui fisier sau director (se poate sterge doar daca e vid): f. delete(); n redenumirea unui fisier sau director: f. rename. To(); n File d = new File(“dir 1); d. mkdir(); alte metode: n n f. get. Name(): f. get. Path(): f. is. File() sau f. is. Directory() f. can. Read() sau f. can. Write():
Clase de fluxuri pe octet
File. Input. Stream si File. Output. Stream n n File. Input. Stream creeaza un Input. Stream ce se poate folosi pentru citirea de octeti din fisier; File. Output. Stream creeaza un Output. Steam ce se poate folosi pentru scrierea de octeti in fisier; import java. io. *; public class Byte. Stream. IO { public static void main(String[] args) { int nroct = 0; int iout = 2807; byte[] bout = new byte[2]; try { File. Output. Stream scriebin = new File. Output. Stream("out. bin"); //transformat int-ul in byte-uri bout[0] = (byte)(iout / 256); //10 bout[1] = (byte)(iout % 256); //247 scriebin. write(bout); scriebin. close(); File. Input. Stream citestebin = new File. Input. Stream("out. bin"); nroct = citestebin. available(); System. out. println(nroct + " octeti. "); if (nroct > 0) {
File. Input. Stream si File. Output. Stream for (int i = 0; i < nroct; i++) System. out. println(citestebin. read()); /* se poate si asa desi numarul * de octeti se cunoaste while ((bin = (byte)citestebin. read()) != -1) System. out. println((int) bin); */ } citestebin. close(); } catch (File. Not. Found. Exception n) { System. err. println("Nu pot lucra cu fiserul!"); } catch (IOException e) { System. err. println("Eroarea de I/E: " + e); } }
Clase de fluxuri pe caractere
File. Reader si File. Writer n n File. Writer creeaza un Writer ce se poate folosi pentru scrierea de caractere in fisier; File. Reader creeaza un Reader ce se poate folosi pentru citirea de caratere din fisier; import java. io. *; public class Char. Stream. IO { public static void main(String[] args) { String s = "2807"; int nroct = 0, in; try { File. Writer scrietxt = new File. Writer("out. txt"); for(int i=0; i<s. length(); ++i) scrietxt. write(s. char. At(i)); /* se poate scrie direct tot sirul cu: scrietxt. write(s); */ scrietxt. flush(); // inainte de close nu e necesar scrietxt. close(); File. Reader citestetxt = new File. Reader("out. txt");
File. Reader si File. Writer while ((in = citestetxt. read()) != -1) { System. out. println((char)in); nroct++; } citestetxt. close(); } catch (IOException e) { System. out. println("Eroarea de I/E: " + e); } } }
Serializare n n fluxurile de obiecte permit operatii de intrare si iesire la nivel de obiect; pentru ca un obiect sa poata fi scris sau citit, clasa ce defineste obiectul trebuie sa implementeze interfata java. io. Serializable (sau java. io. Externalizable); interfata Serializable are rol de marcare, nu are metode, deci nu se scrie cod aditional in clasa ce implementeaza Serializable; implementarea interfetei premite ca mecanismul de serializare Java sa automatizeze procesul de stocare al obiectelor sau tablourilor.
Interfata Serializable import java. io. Serializable; public class Punct implements Serializable{ //Campuri private double x; private double y; private double distanta; //Constructori Punct() { set. X(0); set. Y(0); distanta = 0; } Punct(double x, double y) { set. X(x); set. Y(y); actualizare. Distanta(); } // Metode public void set. X(double x) { this. x = x; actualizare. Distanta(); } public void set. Y(double y) { this. y = y; actualizare. Distanta(); } public double x() { return x; } public double y() { return y; } public double distanta. Origine() { return distanta; } private void actualizare. Distanta() { distanta = Math. sqrt(x*x+y*y); } public String to. String() { return "<" + x + ", " + y + ">"; } }
Interfata Serializable import java. io. *; public class Test. Serializare { public static void main(String[] args) { Punct p 1 = new Punct(1, 1); Punct[] puncte = new Punct[3]; puncte[0]=p 1; puncte[1]= new Punct(2, 2); puncte[2]= new Punct(3, 3); Object. Output. Stream out; Object. Input. Stream in; try { out = new Object. Output. Stream(new File. Output. Stream("obiecte. dat")); out. write. Object(puncte); out. close(); in = new Object. Input. Stream(new File. Input. Stream("obiecte. dat")); Punct [] punctecitie = (Punct []) in. read. Object(); in. close(); for (Punct p: punctecitie) System. out. println(p); } catch (Exception e) { e. print. Stack. Trace(); } } }
Stream si String Tokenizer n Steam. Tokenizer formeaza atomi lexicali de pe Input. Stream delimitati prin anumite multimi de caractere, lucreaza similar cu String. Tokenizer. import java. io. *; import java. util. String. Tokenizer; public class Line. Token. Stream. IO { public static void main(String[] args) { int l = 0; String linie = null; Print. Writer fout = null; Buffered. Reader fin = null; String s; int x; double y 1, y 2; try { fout = new Print. Writer(new File. Writer("linefile. txt")); //scrierea datelor in fisier, separatorul este ", " for (int i = 0; i < 5; ++i) fout. println("Linia " + (i + 1) + ", " + i + ", " + Math. sin(i) + ", " + Math. cos(i)); fout. close(); fin = new Buffered. Reader(new File. Reader("linefile. txt")); while ((linie = fin. read. Line()) != null) { System. out. println("S-a citit linia: "+linie);
//extragerea simbolurilor pe baza separatorului , String. Tokenizer t = new String. Tokenizer(linie, ", "); s = t. next. Token(); x = Integer. parse. Int(t. next. Token()); y 1 = Double. parse. Double(t. next. Token()); y 2 = Double. parse. Double(t. next. Token()); System. out. println(s+x+y 1+y 2); ++l; } System. out. println("S-au citit si prelucrat" + l + " linii"); fin. close(); } catch (IOException e) { } } }
Intrebari 1. 2. 3. 4. 5. Ce este persistenta datelor, cum se ajunge la aceasta prin fisiere? Cate clase abstracte pentru lucrul cu fluxuri sunt in Java si cand se folosesc acestea? Cu ce clasa se manipuleaza sistemul de fisiere (al sistemului de operare), ce operatii sunt posibile? Ce presupune procesul de serializare al unei clase si ce effort de implementare necesita? Ce este o clasa Tokenizer?
Bibliografie 1. 2. 3. 4. 5. 6. http: //www. oracle. com/technetwork/javase/documen tation/index. html http: //docs. oracle. com/javase/6/docs/ Ştefan Tanasă, Cristian Olaru, Ştefan Andrei, Java de la 0 la expert, Polirom, 2003, ISBN: 973 -681 -201 -4. Herber Schild, Java 2 - The Complete Reference, Fourth Edition, Osborne, 2001, ISBN: 0 -07 -213084 -9. Deitel H. M. , Deitel P. J. , Java - How to programm, Fith Edition, Prentice Hall, 2003, ISBN: 0 -13 -120236 -7. http: //www. east. utcluj. ro/mb/mep/antal/downloads. html