Sunteți pe pagina 1din 25

1

Prezentare 13:
Input/Output
Fisiere in format
binar
Serializarea
PROGRAMARE ORIENTATA obiectelor

OBIECT
2020
Fisiere binare

 Stocheaza valori de tip primitiv in acelasi format, cu acelasi numar


de octeti ca in cazul utilizarii memoriei primare
 Clase specifice: DataInputStream, DataOutputStream
 Au metode care citesc/scriu date la nivel de octet

 Permit scrierea/citirea obiectelor prin serializarea lor


 Permit atat access secvential cat si access direct

07.12.2020 POO 2
Fisiere binare
 Deschidere pentru scrierea datelor de tip primitiv
FileOutputStream fos = new FileOutputStream(numeFis);
DataOuputStream inFis = new DataOutputStream(fos);
 DataOutputStream nu are niciun constructor care sa primeasca un
nume de fisier ca argument, dar accepta un FileOutputStream
 poate fi aruncata exceptia – FileNotFoundException – daca
fisierul nu poate fi deschis pentru scriere: nu exista sau nu poate fi
creat sau exista si nu poate fi deschis
 fisierul este vid initial
o daca nu exista, este creat

o daca exista, continutul se pierde

07.12.2020 POO 3
Fisiere binare
 Deschidere pentru scrierea datelor de tip primitiv

String numeFis = "data.bin";


DataOutputStream inFis = null;
try {
FileOutputStream fos = new FileOutputStream(numeFis);
inFis = new DataOutputStream(fos);
}
catch(FileNotFoundException e) {
System.out.println(“fisierul nu poate fi gasit, creat sau deschis “ + numeFis);
System.out.println(e.getMessage());
System.exit(0);
}

07.12.2020 POO 4
Fisiere binare
 Deschidere pentru scriere utilizand clasa File

boolean okDeScris = true;


try {
File unFis = new File(numeFis);
if (unFis.canWrite()) {
FileOutputStream fos = new FileOutputStream(unFis);
inFis = new DataOutputStream(fos);
}
else
okDeScris = false;
}
catch(FileNotFoundException e) {…
}
07.12.2020 POO 5
Fisiere binare
 Scrierea datelor primitive
 writeByte – scrie low-order 8 bits ai argumentului de tip int

 writeChar – scrie low-order 16 bits ai argumentului de tip int ca un

caracter Unicode
 writeShort – scrie low-order 16 bits ai argumentului de tip int

 writeInt – scrie intregul pe 32 biti al argumentului de tip int


 writeLong – scrie valoarea long pe 64 biti a argumentului de tip long

 writeFloat – scrie valoare reala pe 32 biti a argumentului de tip float


 writeDouble – scrie valoare reala pe 64 biti a argumentului de tip
double
 writeBoolean – scrie valoarea booleana a argumentului de tip boolean

07.12.2020 POO 6
Fisiere binare

 Inchidere fisier

inFis.close();

 Poate arunca o exceptie IOException

07.12.2020 POO 7
Fisiere binare

 Adaugare in fisier

FileOutputStream fos = new FileOutputStream(numeFis, true);

 cel de al doilea parametru al constructorului este o


valoare booleana care indica daca se pot adauga date
la sfarsitul fisierului

07.12.2020 POO 8
Fisiere binare
 Operatii cu fisiere binare

public static int creeazaRandomIntFis(String numeFis, int cateVal) {


int rez = 0;
Random gen = new Random();
DataOutputStream fluxFis = null;
try {
FileOutputStream fos = new FileOutputStream(numeFis);
fluxFis = new DataOutputStream(fos);

for(int cont = 0; cont < cateVal; cont++) {


fluxFis.writeInt(gen.nextInt());
}
}
07.12.2020 POO 9
Fisiere binare

 Operatii cu fisiere binare

catch (FileNotFoundException e) {
rez = 1; //err deschidere fis
}
catch (IOException e) {
rez = 2; // err scriere fis
}

07.12.2020 POO 10
Fisiere binare

 Operatii cu fisiere binare

finally {
try {
if(fluxFis != null)
fluxFis.close();
}
catch(IOException e) {
rez = 3; //err inchidere fis
}
return rez;
}
}
}

07.12.2020 POO 11
Fisiere binare
 Deschidere pentru citirea valorilor primitive - DataInputStream
 readByte – citeste si intoarce urmatorul octet din fisier ca
o valoare de tip byte
 readChar – citeste si intoarce urmatorii doi octeti din fisier
ca o valoare de tip char
 readShort – citeste si intoarce urmatorii doi octeti din
fisier ca o valoare de tip short
 readInt – citeste si intoarce urmatorii patru octeti din fisier
ca o valoare de tip int
 readLong – citeste si intoarce urmatorii opt octeti din fisier
ca o valoare de tip long

07.12.2020 POO 12
Fisiere binare
 Deschidere pentru citire - DataOutputStream
 readFloat – citeste si intoarce urmatorii patru octeti din
fisier ca o valoare de tip float
 readDouble – citeste si intoarce urmatorii opt octeti din
fisier ca o valoare de tip double
 readBoolean – citeste si intoarce urmatoarea valoare de
tip boolean

07.12.2020 POO 13
Fisiere binare

 Operatii cu fisiere binare

public static int afisFisBin(String numeFis) {


int rez = 0;
DataInputStream dinFis = null;
try {
FileInputStream fis = new FileInputStream(numeFis);
dinFis = new DataInputStream(fis);

while (true) {
int num = dinFis.readInt();
System.out.println(num);
}
}

07.12.2020 POO 14
Fisiere binare

 Operatii cu fisiere binare

catch (FileNotFoundException e) {
rez = 1; // err deschidere fis
}
catch (EOFException e) { // comportament normal; exceptia este ignorata
}
catch (IOException e) {
rez = 2; // err citire din fis
}

07.12.2020 POO 15
Fisiere binare

 Operatii cu fisiere binare


finally {
try {
if (dinFis != null)
dinFis.close();
}
catch (IOException e) {
rez = 3; // err inchidere fis
}
return rez;
}
}
}

07.12.2020 POO 16
Fisiere binare

 Scrierea si citirea sirurilor


 writeUTF – scrie caracterele din argumentul de tip String

utilizand codificarea UTF (Unicode Transformation Format)


 readUTF – citeste si intoarce urmatorul sir UTF ca un obiect

de tip String
 pot arunca exceptia IOException

07.12.2020 POO 17
Fisiere binare
Observatii
 Un fisier binar poate contine valori avand tipuri diferite
 trebuie scrise/citite cu metodele corespunzatoare

 writeInt/readDouble va genera eroare


 Un fisier text pastreaza datele in format diferit fata de un
fisier binar
 daca DataInputStream incearca sa citeasca date din fisier

text poate citi valori eronate


 Detectarea End of File
 prinderea unei exceptii EOFException, daca metoda care

citeste din fisier arunca exceptia


 testarea unei santinele, daca a fost scrisa la sfarsitul

fisierului
07.12.2020 POO 18
Serializarea obiectelor

 Cum se pot scrie/citi obiecte?


 Java permite serializarea obiectelor – reprezentarea

obiectelor ca o secventa de octeti care poate fi scrisa intr-un


fisier binar
 Posibila pentru orice clasa care implementeaza interfata

Serializable (java.io)

public class Student implements java.io.Serializable

07.12.2020 POO 19
Serializarea obiectelor

 Scrierea obiectelor
 writeObject din clasa ObjectOutputStream

FileOutputStream fos = new FileOutputStream(numeFis);


ObjectOutputStream inFis = new ObjectOutputStream(fos);

inFis.writeObject(student);

07.12.2020 POO 20
Serializarea obiectelor

 Citirea obiectelor
 readObject din clasa ObjectInputStream

FileInputStream fis = new FileInputStream(numeFis);


ObjectInputStream dinFis = new ObjectInputStream(fis);

Student ion = (Student)dinFis.readObject();

07.12.2020 POO 21
Serializarea obiectelor

 O clasa este serializabila daca:


 Implementeaza interfata Serializable

 Campurile au tipuri primitive sau sunt obiecte serializabile

 Superclasa directa, daca exista, este serializabila si are un

constructor implicit (orice subclasa a unei clase serializabile


este serializabila)

07.12.2020 POO 22
Serializarea obiectelor

 Particularitati
 Un obiect serializat primeste un numar de serializare si este

scris intr-un fisier binar


 Daca ulterior se scrie acelasi obiect, este scris numai

numarul de serializare
 La citirea obiectului serializat, se citesc atat datele cat si

numarul de serializare si se creeaza un nou obiect


 Daca este citit un numar de serializare duplicat, este creata

o referinta la obiect

07.12.2020 POO 23
Serializarea obiectelor

 Observatii
 Ar trebui serializate toate obiectele pentru a salva spatiu? NU
 anumite obiecte nu trebuie salvate in fisier

 obiectele serializate sunt usor de accesat, pot aparea

probleme de securitate
 String implementeaza interfata Serializable, se poate folosi
metoda writeObject in loc de writeUTF
 array(s) sunt tratate ca obiecte, deci serializabile; pot fi
utilizate metodele writeObject, readObject

Serializare.zip

07.12.2020 POO 24
Serializarea obiectelor

 Controlul serializarii
 Implementarea interfetei Externalizable
 Externalizable extinde interfata Serializable si adauga

metodele writeExternal si readExternal


 Constructia unui obiect externalizabil este cea implicita pentru
obiecte
 Anumite campuri pot fi eliminate din serializare utilizand
modificatorul transient (interfata Serializable)

Externaliz.zip
Transient.zip

07.12.2020 POO 25

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