Sunteți pe pagina 1din 29

Fluxuri

Programare Orientat pe Obiecte

Fluxuri
Ce sunt fluxurile ? Clasificare, ierarhie Fluxuri primitive Fluxuri de procesare Intr ri #i ie#iri formatate Fluxuri standard de intrare #i ie#ire Analiza lexical Clase independente (RandomAccessFile, File)

Ce sunt fluxurile? (1)


Schimb de informa&ii cu mediul extern l Canal de comunica&ie ntre dou procese
l

Seriale, pe 8 sau 16 bi&i Produc tor: proces care descrie o surs extern de date Consumator: proces care descrie o destina&ie extern pentru date Unidirec&ionale, de la produc tor la consumator Un singur proces produc tor Un singur proces consumator

Ce sunt fluxurile? (2)

Un flux care cite#te date se nume#te flux de intrare. Un flux care scrie date se nume#te flux de ie#ire.

Ce sunt fluxurile? (3)


l

Pachetul care ofer suport pentru opera&iile de intrare/ie#ire: java.io


l

Schema general de utilizare a fluxurilor:

deschide canal comunicatie while (mai sunt informatii) { citeste/scrie informatie; } inchide canal comunicatie;

Clasificarea fluxurilor
Dup direc&ia canalului de comunica&ie:
fluxuri de intrare (citire) fluxuri de ie#ire (scriere)

Dup tipul de date:


fluxuri de octe&i (8 bi&i) fluxuri de caractere (16 bi&i)

Dup ac&iunea lor:


fluxuri primare (se ocup efectiv cu citirea/scrierea datelor) fluxuri pentru procesare

Ierarhia claselor pentru lucrul cu fluxuri Caractere: Reader

FileReader, BufferedReader,... FileWriter, BufferedWriter,...

Writer

Octe&i: InputStream

FileInputStream, BufferedInputStream.. FileOutputStream, BufferedOutputStream..

OutputStream

Metode comune fluxurilor


l

Metodele comune sunt definite n superclasele abstracte corespunz toare:


Writer void write() void write(char buf[]) ... OutputStream void write() void write(byte buf[]) void write(String str)

Reader int read() int read(char buf[]) InputStream int read() int read(byte buf[])

l l

Inchiderea oric rui flux: close. Excep&ii: IOException sau derivate.

Fluxuri primitive
In func&ie de tipul sursei datelor: l Fi#ier FileReader, FileWriter, FileInputStream, FileOutputStream l Memorie CharArrayReader, CharArrayWriter, ByteArrayInputStream, ByteArrayOutputStream, StringReader, StringWriter l Pipe PipedReader, PipedWriter, PipedInputStream, PipedOutputStream

folosite pentru a canaliza ie#irea unui program sau fir de execu&ie c tre intrarea altui program sau fir de execu&ie.

Fluxuri de procesare (1)


l

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 octe&i-caractere/caractere-octe&i InputStreamReader OutputStreamWriter Concatenare SequenceInputStream Serializare ObjectInputStream, ObjectOutputStream

Fluxuri de procesare (2)


Conversie tipuri de date de tip primitiv ntr-un format binar, independent de ma#ina pe care se lucreaz DataInputStream, DataOutputStream Num rare LineNumberReader, LineNumberInputStream Citire n avans PushbackReader, PushbackInputStream Afi#are PrintWriter, PrintStream

Crearea unui flux primitiv


FluxPrimitiv numeFlux =new FluxPrimitiv (dispozitivExtern);
l

crearea unui flux de intrare pe caractere

FileReader in = new FileReader("fisier.txt");


l

crearea unui flux de iesire pe caractere

FileWriter out = new FileWriter("fisier.txt");


l

crearea unui flux de intrare pe octeti

FileInputStream in =new FileInputStream("fisier.dat");


l

crearea unui flux de iesire pe octeti

FileOutputStrem out =new FileOutputStream("fisier.dat");

Crearea unui flux de procesare


FluxProcesare numeFlux = new FluxProcesare(fluxPrimitiv);
crearea unui flux de intrare printr-un buffer BufferedReader in = new BufferedReader(new FileReader("fisier.txt"));
l

//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")));
l

//echivalent cu: FileWriter fo = new FileWriter("fisier.txt"); BufferedWriter out = new BufferedWriter(fo);

Fluxuri pentru lucrul cu fi#iere


FileReader, FileWriter - caractere FileInputStream, FileOutputStream - octeti

Citirea #i scrierea cu buffer


l l l

BufferedReader, BufferedWriter BufferedInputStream, BufferedOutputStream Introduc un buffer (zon de memorie) n procesul de citire/scriere a informa&iilor.
BufferedOutputStream out = new BufferedOutputStream (new FileOutputStream("out.dat"), 1024); //1024 este dimensiunea bufferului

Scopul: eficien&a - Scade num rul de acces ri ale dispozitivului extern - Cre#te viteza de execu&ie

Metoda flush
- gole te 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
l l

l l

un flux nu mai este v zut ca o nsiruire de octe&i, ci de date primitive. scrierea datelor se face n format binar, ceea ce nseamn c un fi#ier n care au fost scrise informa&ii 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.

Intr ri formatate: java.util.Scanner

Scanner s=new Scanner(System.in); String nume = s.next(); int varsta = s.nextInt(); double salariu = s.nextDouble(); s.close();

Ie#iri formatate
PrintStream #i PrintWriter : print, println format, printf System.out.printf("%s %8.2f %2d %n", nume, salariu, varsta);
l

Formatarea #irurilor de caractere se bazeaz pe clasa java.util.Formatter.

Fluxuri standard de intrare #i ie#ire


System.in - InputStream System.out - PrintStream System.err - PrintStream Afi#area informa&iilor pe ecran: System.out.print (argument); System.out.println(argument); System.out.printf (format, argumente...); System.out.format (format, argumente...);
l

Afi#area erorilor: catch(Exception e) { System.err.println("Exceptie:" + e); }


l

Citirea datelor de la tastatur (1)


Clasa BufferedReader BufferedReader stdin = new BufferedReader( new InputStreamReader(System.in)); System.out.print("Introduceti o linie:"); String linie = stdin.readLine() System.out.println(linie);
l

Clasa DataInputStream DataInputStream stdin = new DataInputStream( System.in); System.out.print("Introduceti o linie:"); String linie = stdin.readLine() System.out.println(linie);
l

Clasa java.util.Scanner (1.5) Scanner s=Scanner.create(System.in);


l

Citirea datelor de la tastatur (2)


l

Redirectarea fluxurilor standard: stabilirea unei alte surse dect tastatura pentru citirea datelor, respectiv alte destina&ii dect ecranul pentru cele dou fluxuri de ie#ire. setIn(InputStream) - redirectare intrare setOut(PrintStream) - redirectare ie#ire setErr(PrintStream) - redirectare erori

l l l

PrintStream fis = new PrintStream( new FileOutputStream("rezultate.txt"))); System.setOut(fis); PrintStream fis = new PrintStream(new FileOutputStream("erori.txt"))); System.setErr(fis);

Analiza lexical pe fluxuri: StreamTokenizer

Clasa RandomAccessFile
permite accesul nesecven&ial (direct) la con&inutul unui fi#ier; este o clas de sine st t toare, subclas direct a clasei Object; se g se#te n pachetul java.io; ofer metode de tipul readX, writeX; permite att citirea ct #i scriere din/n fi#iere cu acces direct; permite specificarea modului de acces al unui fi#ier (read-only, read-write). RandomAccessFile f1 = new RandomAccessFile("fisier.txt", "r");
//deschide un fisier pentru citire

RandomAccessFile f2 =new RandomAccessFile("fisier.txt", "rw");


//deschide un fisier pentru scriere si citire

Clasa RandomAccessFile (2)


l

Program pentru afi#area pe ecran a liniilor dintr-un fi#ier text, fiecare linie precedat de num rul liniei #i de un spa&iu.

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 (1)


l

l l l

Clasa File nu se refer# doar la un fi ier ci poate reprezenta fie un fi ier anume, fie mul&imea fi ierelor dintr-un director. Utilitatea clasei File const# n furnizarea unei modalit#&i de a abstractiza dependen&ele c#ilor i numelor fi ierelor fa&# de ma ina gazd# Ofer# metode pentru testarea existen&ei, tergerea, redenumirea unui fi ier sau director, crearea unui director, listarea fi ierelor dintr-un director, etc. Constructorii fluxurilor pentru fi iere accept# ca argument obiecte de tip File: File f = new File("fisier.txt"); FileInputStream in = new FileInputStream(f); String[ ] list() File[ ] listFiles() String getAbsolutePath()

Clasa File (2)


l

Listare fi iere dintr-un director dat, cu indentare, recursiv, n subdirectoare

import java.io.*; import java.util.*; class Dir{ public void dirlist (File d, String sp) throws IOException { String [] files=d.list(); //lista numelor din obiectul d if (files ==null ) return; String path =d.getAbsolutePath(); //calea completa spre obiectul d

Clasa File (3)


for(int i=0;i<files.length;i++){ File f = new File(d+"\\"+files[i]); if (f.isDirectory()) { System.out.println (sp+path+"\\"+files[i]); dirlist (f,sp+" "); } else System.out.println (sp+ files[i]); } } 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)," "); } }

S-ar putea să vă placă și