1 / 18

C12 – LPO: Operatii de Intrare/iEsire cu fisiere

C12 – LPO: Operatii de Intrare/iEsire cu fisiere. CUPRINS Fisiere Fluxuri pe octet pe caracter Serializare Tokenizer (analiza lexicala). Obiective. După parcurgerea acestui curs ar trebuie sa puteţi: înţelege principiile de lucru fisiere si fluxuri in Java;

nyla
Download Presentation

C12 – LPO: Operatii de Intrare/iEsire cu fisiere

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. C12 – LPO: Operatii de Intrare/iEsire cu fisiere CUPRINS Fisiere Fluxuri pe octet pe caracter Serializare Tokenizer (analiza lexicala)

  2. Obiective După parcurgerea acestui curs ar trebuie sa puteţi: • înţelege principiile de lucru fisiere si fluxuri in Java; • manipula date date prin fluxuri pe caracter si octer; • serializa obiecte prin fluxuri; • realiza analiza lexicala a datelor stocate in fisiere.

  3. Fisiere Java • fişierul este o structura de date ce asigura pastrarea permanenta (persistenta) datelor; • datele sunt stocate utilizând doua formate: • 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.

  4. Fluxuri • operatiile de intrare/ieşire pe fluxuri au la baza patru clase abstracte: InputStream, OutputStream, 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; • InputStream şi OutputStream 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.

  5. Fisiere externe si directori • 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: • stergerea unui fisier sau director (se poate sterge doar daca e vid): • redenumirea unui fisier sau director: • alte metode: • f.getName(): • f.getPath(): • f.isFile() sau f.isDirectory() • f.canRead() sau f.canWrite(): File f = new File(“nume.txt”); f.createNewFile(); File d = new File(“dir1); d.mkdir(); f.delete(); f.renameTo();

  6. Clase de fluxuri pe octet

  7. FileInputStream si FileOutputStream • FileInputStream creeaza un InputStream ce se poate folosi pentru citirea de octeti din fisier; • FileOutputStream creeaza un OutputSteam ce se poate folosi pentru scrierea de octeti in fisier; import java.io.*; public class ByteStreamIO { public static void main(String[] args) { int nroct = 0; int iout = 2807; byte[] bout = new byte[2]; try { FileOutputStream scriebin = new FileOutputStream("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(); FileInputStream citestebin = new FileInputStream("out.bin"); nroct = citestebin.available(); System.out.println(nroct + " octeti."); if (nroct > 0) {

  8. FileInputStream si FileOutputStream 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 (FileNotFoundException n) { System.err.println("Nu pot lucra cu fiserul!"); } catch (IOException e) { System.err.println("Eroarea de I/E: " + e); } }

  9. Clase de fluxuri pe caractere

  10. FileReader si FileWriter • FileWriter creeaza un Writer ce se poate folosi pentru scrierea de caractere in fisier; • FileReader creeaza un Reader ce se poate folosi pentru citirea de caratere din fisier; import java.io.*; public class CharStreamIO { public static void main(String[] args) { String s = "2807"; int nroct = 0, in; try { FileWriter scrietxt = new FileWriter("out.txt"); for(int i=0; i<s.length();++i) scrietxt.write(s.charAt(i)); /* se poate scrie direct tot sirul cu: scrietxt.write(s); */ scrietxt.flush(); // inainte de close nu e necesar scrietxt.close(); FileReader citestetxt = new FileReader("out.txt");

  11. FileReader si FileWriter while ((in = citestetxt.read()) != -1) { System.out.println((char)in); nroct++; } citestetxt.close(); } catch (IOException e) { System.out.println("Eroarea de I/E: " + e); } } }

  12. Serializare • 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.

  13. Interfata Serializable import java.io.Serializable; public class Punct implements Serializable{ //Campuri private double x; private double y; private double distanta; //Constructori Punct() { setX(0); setY(0); distanta = 0; } Punct(double x, double y) { setX(x); setY(y); actualizareDistanta(); } // Metode public void setX(double x) { this.x = x; actualizareDistanta(); } public void setY(double y) { this.y = y; actualizareDistanta(); } public double x() { return x; } public double y() { return y; } public double distantaOrigine() { return distanta; } private void actualizareDistanta() { distanta = Math.sqrt(x*x+y*y); } public String toString() { return "<" + x + "," + y + ">"; } }

  14. Interfata Serializable import java.io.*; public class TestSerializare { public static void main(String[] args) { Punct p1 = new Punct(1,1); Punct[] puncte = new Punct[3]; puncte[0]=p1; puncte[1]= new Punct(2,2); puncte[2]= new Punct(3,3); ObjectOutputStream out; ObjectInputStream in; try { out = new ObjectOutputStream(new FileOutputStream("obiecte.dat")); out.writeObject(puncte); out.close(); in = new ObjectInputStream(new FileInputStream("obiecte.dat")); Punct [] punctecitie = (Punct []) in.readObject(); in.close(); for (Punct p: punctecitie) System.out.println(p); } catch (Exception e) { e.printStackTrace();} } }

  15. Stream si String Tokenizer • SteamTokenizer formeaza atomi lexicali de pe InputStream delimitati prin anumite multimi de caractere, lucreaza similar cu StringTokenizer. import java.io.*; import java.util.StringTokenizer; public class LineTokenStreamIO { public static void main(String[] args) { int l = 0; String linie = null; PrintWriter fout = null; BufferedReader fin = null; String s; int x; double y1, y2; try { fout = new PrintWriter(new FileWriter("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 BufferedReader(new FileReader("linefile.txt")); while ((linie = fin.readLine()) != null) { System.out.println("S-a citit linia: "+linie);

  16. //extragerea simbolurilor pe baza separatorului , StringTokenizer t = new StringTokenizer(linie,","); s = t.nextToken(); x = Integer.parseInt(t.nextToken()); y1 = Double.parseDouble(t.nextToken()); y2 = Double.parseDouble(t.nextToken()); System.out.println(s+x+y1+y2); ++l; } System.out.println("S-au citit si prelucrat" + l + " linii"); fin.close(); } catch (IOException e) { } } }

  17. Intrebari • 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?

  18. Bibliografie • http://www.oracle.com/technetwork/java/javase/documentation/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

More Related