Documente Academic
Documente Profesional
Documente Cultură
Fluxuri
Ce sunt fluxurile ? Clasificare, ierarhie Fluxuri primitive Fluxuri de procesare Intrri i ieiri formatate Fluxuri standard de intrare i ieire Analiza lexical Clase independente (RandomAccessFile, File)
Seriale, pe 8 sau 16 bii Productor: proces care descrie o surs extern de date Consumator: proces care descrie o destinaie extern pentru date Unidirecionale, de la productor la consumator Un singur proces productor Un singur proces consumator
Un flux care citete date se numete flux de intrare. Un flux care scrie date se numete flux de ieire.
deschide canal comunicatie while (mai sunt informatii) { citeste/scrie informatie; } inchide canal comunicatie;
Clasificarea fluxurilor
Dup direcia canalului de comunicaie:
fluxuri de intrare (citire) fluxuri de ieire (scriere)
Writer
Octei: InputStream
OutputStream
Reader
Fluxuri primitive
In funcie de tipul sursei datelor: Fiier FileReader, FileWriter, FileInputStream, FileOutputStream Memorie CharArrayReader, CharArrayWriter, ByteArrayInputStream, ByteArrayOutputStream, StringReader, StringWriter Pipe PipedReader, PipedWriter, PipedInputStream, PipedOutputStream
folosite pentru a canaliza ieirea unui program sau fir de execuie ctre intrarea altui program sau fir de execuie.
responsabile cu preluarea datelor de la un flux primitiv i procesarea acestora pentru a le oferi ntr-o alt form, mai util dintr-un anumit punct de vedere.
Bufferizare BufferedReader, BufferedWriter BufferedInputStream, BufferedOutputStream Conversie octei-caractere/caractere-octei InputStreamReader OutputStreamWriter Concatenare SequenceInputStream Serializare ObjectInputStream, ObjectOutputStream
//echivalent cu: FileReader fr = new FileReader("fisier.txt"); BufferedReader in = new BufferedReader(fr); crearea unui flux de iesire printr-un buffer BufferedWriter out = new BufferedWriter(new FileWriter("fisier.txt")));
Scopul: eficiena - Scade numrul de accesri ale dispozitivului extern - Crete viteza de execuie
Metoda flush
- golete explicit bufferul BufferedWriter out = new BufferedWriter(new FileWriter("out.dat"), 1024); //am creat un flux cu buffer de 1024 octeti for(int i=0; i<1000; i++) out.write(i); //bufferul nu este plin, in fisier nu s-a scris nimic out.flush(); //bufferul este golit, datele se scriu in fisier
Metoda readLine
BufferedReader br = new BufferedReader(new FileReader("in")); String linie; while ((linie = br.readLine()) != null) { ... //proceseaza linie } br.close();
DataInputStream i DataOutputStream
un flux nu mai este vzut ca o nsiruire de octei, ci de date primitive. scrierea datelor se face n format binar, ceea ce nseamn c un fiier n care au fost scrise informaii folosind metode writeX nu va putea fi citit dect prin metode readX. transformarea unei valori n format binar - serializare. permit serializarea tipurilor primitive i a irurilor de caractere.
Scanner s=new Scanner(System.in); String nume = s.next(); int varsta = s.nextInt(); double salariu = s.nextDouble(); s.close();
Ieiri formatate
PrintStream i PrintWriter : print, println format, printf System.out.printf("%s %8.2f %2d %n", nume, salariu, varsta);
Clasa DataInputStream DataInputStream stdin = new DataInputStream( System.in); System.out.print("Introduceti o linie:"); String linie = stdin.readLine() System.out.println(linie);
Redirectarea fluxurilor standard: stabilirea unei alte surse dect tastatura pentru citirea datelor, respectiv alte destinaii dect ecranul pentru cele dou fluxuri de ieire. setIn(InputStream) - redirectare intrare setOut(PrintStream) - redirectare ieire setErr(PrintStream) - redirectare erori
PrintStream fis = new PrintStream( new FileOutputStream("rezultate.txt"))); System.setOut(fis); PrintStream fis = new PrintStream(new FileOutputStream("erori.txt"))); System.setErr(fis);
Clasa RandomAccessFile
permite accesul nesecvenial (direct) la coninutul unui fiier; este o clas de sine stttoare, subclas direct a clasei Object; se gsete n pachetul java.io; ofer metode de tipul readX, writeX; permite att citirea ct i scriere din/n fiiere cu acces direct; permite specificarea modului de acces al unui fiier (read-only, read-write). RandomAccessFile f1 = new RandomAccessFile("fisier.txt", "r");
//deschide un fisier pentru citire
Program pentru afiarea pe ecran a liniilor dintr-un fiier text, fiecare linie precedat de numrul liniei i de un spaiu.
import java.io.*; class A{ public static void main(String arg[]) throws IOException{ RandomAccessFile raf=new RandomAccessFile( arg[0],"r"); String s; int i=1; while( (s=raf.readLine())!=null) { System.out.println(i+" "+s); i++; } raf.close(); } }
Clasa File nu se refer doar la un fiier ci poate reprezenta fie un fiier anume, fie mulimea fiierelor dintr-un director. Utilitatea clasei File const n furnizarea unei modaliti de a abstractiza dependenele cilor i numelor fiierelor fa de maina gazd Ofer metode pentru testarea existenei, tergerea, redenumirea unui fiier sau director, crearea unui director, listarea fiierelor dintr-un director, etc. Constructorii fluxurilor pentru fiiere accept ca argument obiecte de tip File: File f = new File("fisier.txt"); FileInputStream in = new FileInputStream(f); String[ ] list() File[ ] listFiles() String getAbsolutePath()
import java.io.*; import java.util.*; class Dir{ public static void main (String arg[]) throws IOException { String dname ="."; if (arg.length ==1) dname=arg[0]; Dir d= new Dir(); d.dirlist(new File(dname)," "); }
Polimorfism
Polimorfism abilitatea unui obiect de a se comporta diferit la acelai mesaj Dou tipuri: static i dinamic Suprancrcarea (overloading) Supradefinirea (overriding)
class A { void metoda() { System.out.println("A: metoda fara parametru"); } // Suprancrcare void metoda(int arg) { System.out.println("A: metoda cu un parametru"); } } class B extends A { // Supradefinire void metoda() { System.out.println("B: metoda fara parametru"); } }
Static binding i dynamic binding - dou concepte importante n Java Legate direct de execuia codului Mai multe metode cu acelai nume (method overriding) sau dou variabile cu acelai nume n aceeai ierarhie de clase, care este utilizat? Binding procesul de a stabili ce metod sau variabil va fi apelat Majoritatea referinelor sunt rezolvate n timpul compilrii, dar cele care depind de Obiect i polimorfism sunt rezolvate la execuie, atunci cnd este de fapt disponibil obiectul. Dynamic binding late binding (la execuie) Static binding early binding (la compilare)
Metodele i variabilele private, final sau static utilizeaz static binding n timp ce metodele virtuale - abstracte utilizeaz dynamic binding. Static binding se face pe baza informaiei legate de Tip (clasa n Java), n timp ce Dynamic binding utilizeaz Obiectul pentru a realiza legarea. Static binding este folosit frecvent la metodele suprancrcate (overloaded methods), Dynamic binding (dynamic dispatch) este asociat n general cu metodele supradefinite (overriding methods).
Dynamic Binding
Conceptul de overriding Car extends Vehicle - supradefinete start() Apelul lui start() pentru un obiect Vehicle, apeleaz start() din subclasa Car deoarece obiectul referit de tipul Vehicle este un obiect Car Aceasta se petrece la execuie pentru c obiectul este creat doar la execuie -> Dynamic binding in Java. Dynamic binding este mai ncet dect static binding pentru c apare n momentul execuiei i necesit timp pentru a determina care metod este apelat de fapt.
Output: Cainele este un: ciobanesc (dynamic binding) Tipul este: mamifer" (static binding)
Observaii
Datele nu sunt niciodat supradefinite, doggie.type folosete Animal.type -- "static binding Avantaj: comportamentul este legat de tipul obiectului invocat, fr ca noi s tim precis tipul acestuia. Exemplu: Daca trimitem un Animal, nu tim dac este Cat/Dog/altceva, dar el va adopta comportamentul adecvat:
Fiecare animal din lista va produce propriul zgomot (va mieuna, ltra, etc) Observaie: Clasa Animal poate fi abstracta. Astfel, comportamentul va fi definit de clasele concrete derivate din ea.
Exemplu
public class Shape { int x= 10; void draw() { System.out.println(Shape); } } public class Circle extends Shape{ int x=5; void draw(){ System.out.println(Circle); } } public class Test{ public static void main(String[] args) { Shape shape = new Circle(); shape.draw(); // DYNAMIC BINDING System.out.println(shape.x); // STATIC BINDING } }
Explicaii
Atunci cnd compilatorul vede apelul draw(), el tie c obiectul respectiv este de tipul Shape, dar el tie i c acel obiect poate fi o referin la orice clas derivat din Shape. De aceea, compilatorul nu tie ce versiune a metodei draw() este de fapt apelat. Aceasta se va ti doar n momentul execuiei instruciunii respective: shape.draw(); - metoda draw din Circle
n unele cazuri, compilatorul poate determina versiunea corect. n Java, variabilele membru prezint static binding, deoarece Java nu permite comportament polimorfic pentru variabilele membru. Aceasta nseamn c att clasa Shape ct i clasa Circle au o cte o variabil membru cu acelai nume: System.out.println(shape.x); - valoarea lui x din Shape.
Exerciiu propus
Cum ar trebui s fie definite clasele Adult, Student i Inginer astfel nct urmtoarea secven s dea eroare la compilare doar unde este specificat?
class Test { public static void main(String args[]) { Adult a = new Student(); /* fara eroare */ Adult b = new Inginer();/* fara eroare */ a.explorare(); // fara eroare b.explorare(); // fara eroare a.afisare(); //fara eroare b.afisare(); //eroare la compilare! } }