Curs 2 - Fluxuri

5
Fluxuri de intrare/ieşire 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: declarăm o clasă B care extinde A, construim un obiect b de tipul B şi putem invoca b.met(). Există însă limitări de aplicare, ţinând de context sau de limbaj, dintre care menţionăm: - de multe ori invocarea lui met trebuie făcută într- un anumit context, de exemplu printr-un anumit obiect de tipul A, cu anumite câmpuri; - este posibil să dorim ca din clasa B să utilizăm ş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, ilustrăm această variantă pentru cazul unei singure metode: class B { A a; B(A a) { this.a = a; } ... met(...) { ...; a.met(); ... } } situaţie în care procedăm astfel: B b = new B(new A()); b.met(...). Spunem că obiectul b suprapune obiectul a, respectiv că (prin suprapunere) clasa B adaugă noi facilităţi clasei A. 1

description

curs info

Transcript of Curs 2 - Fluxuri

Page 1: Curs 2 - Fluxuri

Fluxuri de intrare/ieşire

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: declarăm o clasă B care extinde A, construim un obiect b de tipul B şi putem invoca b.met().

Există însă limitări de aplicare, ţinând de context sau de limbaj, dintre care menţionăm:

- de multe ori invocarea lui met trebuie făcută într-un anumit context, de exemplu printr-un anumit obiect de tipul A, cu anumite câmpuri;

- este posibil să dorim ca din clasa B să utilizăm ş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, ilustrăm această variantă pentru cazul unei singure metode:

class B { A a; B(A a) { this.a = a; }

... met(...) { ...; a.met(); ... }

}

situaţie în care procedăm astfel:B b = new B(new A()); b.met(...).

Spunem că obiectul b suprapune obiectul a, respectiv că (prin suprapunere) clasa B adaugă noi facilităţi clasei A.

O primă clasificare a fluxurilor are în vedere elementele de bază care sunt transmise: caractere sau octeţi.

Toate clasele, interfeţele şi metodele din pachetul java.io au modificatorul public, iar în plus aproape toate metodele conţin clauza throws IOException.

1

Object InputStream (clasă abstractă pt. citire la nivel de octet) OutputStream (clasă abstractă pt. scriere la nivel de octet) Reader (clasă abstractă pentru citire la nivel de caracter) Writer (clasă abstractă pt. scriere la nivel de caracter)

Page 2: Curs 2 - Fluxuri

2. Fluxuri ce lucrează la nivel de octet

Observaţie. Vom restrânge în continuare discuţia la a prezenta cele mai simple facilităţi pentru a scrie în fişiere, respectiv de a citi din fişiere:

- octeţi : clasele FileOutputStream şi FileInputStream ;- date de tipuri primitive şi şiruri de caractere : clasele DataOutputStream şi

DataInputStream;- obiecte : vezi "Serializarea obiectelor".

Scrierea şi citirea de octeţi

Exemplul 1. Dorim să copiem un fişier 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(); }}

2

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

Page 3: Curs 2 - Fluxuri

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 număr natural n şi apoi n numere reale; vom crea în directorul curent un fişier cu numele out.dat în care vom scrie datele citite. Într-o a doua etapă vom citi din fişierul out.dat valoarea n şi cele n numere şi le vom tipări la ieşirea standard.

Prima etapă este realizată de următorul 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 următoarea:

3

Object Writer (clasă abstractă) OutputStreamWriter FileWriter PrintWriter Reader (clasă abstractă) InputStreamReader FileReader

Page 4: Curs 2 - Fluxuri

Exemplul 3. Utilizarea clasei PrintWriter pentru scrierea în fişiere text.Şirul cifrelor este scris atât la ieşirea standard, cât şi în fişierul 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 observaţia că neînchiderea explicită a unui flux poate conduce la neînregistrarea în fişier a tuturor datelor prevăzute a fi scrise în el prin program.

4