Sunteți pe pagina 1din 4

1

Fluxuri de intrare/ieire
0. Suprapunerea obiectelor
Fie clasa:

class A {
... met(...) { ... }
}

Dorim ca o clas B s poat utiliza metoda met.


O modalitate este oferit de mecanismul de extindere a claselor: declarm o
clas B care extinde A, construim un obiect b de tipul B i putem invoca b.met().
Exist ns limitri de aplicare, innd de context sau de limbaj, dintre care
menionm:
- de multe ori invocarea lui met trebuie fcut ntr-un anumit context, de
exemplu printr-un anumit obiect de tipul A, cu anumite cmpuri;
- este posibil s dorim ca din clasa B s utilizm i metode din alte clase; dar o
clas poate extinde o singur clas.
O alt modalitate, folosit n lucrul cu fluxuri, o constituie cea de suprapunere
de obiecte (n cazul fluxurilor va fi numit suprapunere de fluxuri).
Pentru simplificare, ilustrm aceast variant pentru cazul unei singure
metode:
class B {
A a;
B(A a) { this.a = a; }
... met(...) { ...; a.met(); ... }
}

situaie n care procedm astfel:

B b = new B(new A()); b.met(...).

Spunem c obiectul b suprapune obiectul a, respectiv c (prin suprapunere)


clasa B adaug noi faciliti clasei A.
O prim clasificare a fluxurilor are n vedere elementele de baz care sunt
transmise: caractere sau octei.
Object
InputStream
OutputStream
Reader
Writer

(clas abstract pt. citire la nivel de octet)


(clas abstract pt. scriere la nivel de octet)
(clas abstract pentru citire la nivel de caracter)
(clas abstract pt. scriere la nivel de caracter)

Toate clasele, interfeele i metodele din pachetul java.io au modificatorul


public, iar n plus aproape toate metodele conin clauza throws IOException.

2. Fluxuri ce lucreaz la nivel de octet


Object
DataInput
(interfa)
InputStream
(clas abstract)
FileInputStream
FilterInputStream
DataInputStream implements DataInput
DataOutput
(interfa)
OuputStream
(clas abstract)
FileOutputStream
FilterOutputStream
DataOutputStream implements DataOutput

Observaie. Vom restrnge n continuare discuia la a prezenta cele mai simple


faciliti pentru a scrie n fiiere, respectiv de a citi din fiiere:
- octei : clasele FileOutputStream i FileInputStream ;
- date de tipuri primitive i iruri de caractere : clasele DataOutputStream i
DataInputStream;
- obiecte : vezi "Serializarea obiectelor".

Scrierea i citirea de octei


Exemplul 1. Dorim s copiem un fiier cu un nume dat sub un alt nume.

import java.io.*;
import java.util.*;
class Copiere {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
System.out.print("Fisier cerut: ");
String fisier = sc.next();
InputStream is = null;
try { is = new FileInputStream(fisier); }
catch(FileNotFoundException e) {
System.out.println("Fisier inexistent");
System.exit(0);
}
System.out.print("Numele copiei : ");
fisier = sc.next();
OutputStream os = new FileOutputStream(fisier);

}
}

int c = 123;
while( (c=is.read()) != -1) os.write(c);
System.out.println("\nFisier copiat!");
is.close(); os.close();

Scrierea i citirea de date primitive

Dac dorim s scriem/citim tipuri primitive sau iruri de caractere, vom folosi
clasele DataOutputStream i DataInputStream.
Exemplul 2. ntr-o prim etap vom citi de la intrarea standard un numr
natural n i apoi n numere reale; vom crea n directorul curent un fiier cu numele
out.dat n care vom scrie datele citite. ntr-o a doua etap vom citi din fiierul
out.dat valoarea n i cele n numere i le vom tipri la ieirea standard.
Prima etap este realizat de urmtorul program:
import java.io.*;
import java.util.*;
class Unu {
public static void main(String[] sir) throws Exception {
int n;
Scanner sc = new Scanner(System.in);
DataOutputStream dos = new DataOutputStream(
new FileOutputStream("out.dat"));
System.out.println("n= "); n = sc.nextInt();
dos.writeInt(n);
System.out.println("Introduceti " +n+ " numere reale:");
for(int i=0; i<n; i++) dos.writeDouble(sc.nextDouble());
dos.close();
}

=======

import java.io.*;
class Doi {
public static void main(String[] ss) throws Exception {
double d; int n;
DataInputStream dis = new DataInputStream(
new FileInputStream("out.dat") );
n = dis.readInt();
for (int i=0; i<n; i++)
System.out.print(dis.readDouble() + "\t" );
System.out.println(); dis.close();
}
}

3. Fluxuri ce lucreaz la nivel de caracter


O structur simplificat de clase este urmtoarea:
Object
Writer
(clas abstract)
OutputStreamWriter
FileWriter
PrintWriter
Reader
(clas abstract)
InputStreamReader
FileReader

Exemplul 3. Utilizarea clasei PrintWriter pentru scrierea n fiiere text.


irul cifrelor este scris att la ieirea standard, ct i n fiierul out.
import java.io.*;
class Print {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("out");
PrintWriter out = new PrintWriter(fos);
PrintWriter stdout = new PrintWriter(System.out);
out.println("Cifrele zecimale sunt:");
for(int i=0; i<10; i++) out.print(i + "\t");
out.println();
stdout.println("Cifrele zecimale sunt:");
for(int i=0; i<10; i++) stdout.print(i + "\t");
stdout.println();
out.close(); // stdout.close();
}

Facem observaia c nenchiderea explicit a unui flux poate conduce la


nenregistrarea n fiier a tuturor datelor prevzute a fi scrise n el prin program.