Documente Academic
Documente Profesional
Documente Cultură
LUCRAREA NR. 8
Stream-uri de intrare-ieșire. Clasa File. Serializare.
1. Scopul lucrării
Această lucrare de laborator prezintă operațiile de intrare-ieșire în Java pe baza unor exemple,
precum și mecanismul de serializare a obiectelor.
2. Stream-uri standard
Limbajul Java pune la dispoziția utilizatorului trei stream-uri standard, din pachetul java.io:
➢ stream-ul standard de intrare
➢ stream-ul standard de ieșire
➢ stream-ul standard de erori
Stream-ul standard de intrare este utilizat pentru preluarea datelor, iar celelalte două stream-uri
standard sunt utilizate pentru afișarea datelor și a mesajelor de eroare. Implicit stream-ul de intrare
preia datele de la tastatură iar celelalte două afișează datele la monitor.
Stream-urile standard sunt definite în clasa System, prin variabilele System.in, System.out,
System.err.
Programul următor afișează o listă cu opțiuni corespunzătoare mai multor tipuri de informații
disponibile spre afișare. Utilizatorul poate alege una din opțiuni prin tastarea unei litere. Se va afișa
informația cerută de utilizator.
import java.io.*;
import java.util.*;
1
Laborator Programare Java Lucrarea nr. 8
int av = System.in.available();
System.in.skip(av);
switch(readChar) {
case 'd' : case 'D':
System.out.println("Data:" + new Date().toString());
break;
case 'p' : case 'P':
Properties prop = System.getProperties();
prop.list(System.out);
break;
case 'x' : case 'X':
System.out.println("La revedere!");
exit = true;
break;
}
}
catch(IOException e) {
System.err.println(e.getMessage());
}
}
}
}
Observații. În program s-a folosit o variabilă booleană exit ca flag de ieșire din program, dar se putea
utilize metoda System.exit(0) pentru acest lucru.Citirea folosind metoda read( ) se încheie doar în
momentul apăsării tastei Enter. În cazul în care se introduce mai multe caractere se citește doar
primul dintre ele, se calculează numărul de caractere rămase necitite (cu metoda available() ) și se
sare peste ele (cu metoda skip() ). Toate operațiile se execută în interiorul unui bloc try-catch datorită
excepțiilor de tip IOException ce pot fi aruncate de metodele apelate prin System.in.
Metoda getProperties
- Este o metodă a clasei System și returnează un obiect de tip Properties, care este o clasă
derivată din clasa Hashtable.
- Are prototipul:
public static Properties getProperties( )
- Determină proprietățile sistemului current
- Mulțimea proprietăților include valorile asociate cheilor, semnificația este dată mai jos (din
documentația API Java):
2
Laborator Programare Java Lucrarea nr. 8
3
Laborator Programare Java Lucrarea nr. 8
4
Laborator Programare Java Lucrarea nr. 8
int i = 0;
while (i < 26) {
// extra +26 below because key might be negative
if (c == s.charAt(i)) return s.charAt((i + key + 26)%26);
i++;
}
return c;
}
Creați un proiect și executați aplicația Caesar folosind o comandă de forma java Caesar –e 3, în linia
de comandă.
Pentru detalii privind algoritmi de criptare în limbajul Java se poate studia cartea „The laws of
Cryptography with Java Code” al lui Neal R. Wagner.
4. Clasa File
Exemplul 1. Listarea conținutului unui director
5
Laborator Programare Java Lucrarea nr. 8
6
Laborator Programare Java Lucrarea nr. 8
try{
File f1 = new File(srFile);
File f2 = new File(dtFile);
InputStream in = new FileInputStream(f1);
//pentru adaugarea in fisier
OutputStream out = new FileOutputStream(f2,true);
5. Serializarea obiectelor
Serializarea reprezintă un mecanism prin care un obiect poate fi transformat într-o secvență de bytes
care poate fi folosită pentru refacerea completă a obiectului inițial. Secvența de bytes poate fi
transmisă în rețea sau poate fi stocată într-o memorie.
Avantajul serializării este faptul că simplifică procedura de transmitere a unui obiect între două entități
ale unui sistem. Reconstituirea unui obiect din forma serializată se poate face , fie pe aceeași mașină,
fie pe o altă platformă decât cea pe care s-a creat serializarea.
Pentru a fi serializabilă, o clasă trebuie să implementeze interfața Serializable din pachetul java.io.
Dacă se dorește ca o variabilă de instanță să fie ignorată în procesul de serializare, se marchează
variabila respectivă ca tranzitorie, folosind cuvântul cheie transient.
Deserializarea reprezintă procedura de refacere completă a obiectului inițial.
Aplicația următoare are ca scop salvarea și refacerea stării personajelor unui joc.
7
Laborator Programare Java Lucrarea nr. 8
Clasa GameCharacter
import java.io.Serializable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
public class GameSaverTest
{
public static void main (String[] args) {
GameCharacter one = new GameCharacter(50, "Elf", new String[] {"bow",
"sword", "dust"});
GameCharacter two = new GameCharacter(200, "Troll", new String[] {"bare
hands", "big axe"});
GameCharacter three = new GameCharacter(120, "Magician", new String[]
{"spells", "invisibility"});
8
Laborator Programare Java Lucrarea nr. 8
try {
ObjectOutputStream os = new ObjectOutputStream(new
FileOutputStream("Game.ser"));
os.writeObject(one);
os. writeObject (two);
os. writeObject (three);
os.close();
}
catch (IOException ex) {
ex.printStackTrace();
}
one = null;
two = null;
three = null;
try {
ObjectInputStream is = new ObjectInputStream(new
FileInputStream("Game.ser"));
GameCharacter oneRestore = (GameCharacter) is.readObject();
GameCharacter twoRestore = (GameCharacter) is.readObject();
GameCharacter threeRestore = (GameCharacter) is.readObject();
Observație. Verificați crearea fișierului Game.ser în directorul current. Datele din fișier par a nu avea
sens dacă le citim ca text. Un fișier serializat este mai greu de citi de către noi, dar este mai ușor și
mai sigur pentru un program să refacă starea obiectelor din informațiile serializate decât prin citirea
valorilor variabilelor salvate într-un fișier text.
Întrebare: Ce face metoda getType( ) ?
9
Laborator Programare Java Lucrarea nr. 8
6. Verificarea cunoștințelor
1) Rearanjați secvențele de cod astfel încât să obțineți un program Java funcțional care produce
rezultatele de mai jos?
% java DungeonTest
12
8
10
Laborator Programare Java Lucrarea nr. 8
1. Creați o clasă care să copie un director sau un fișier dintr-un director în altul.
2. Descrieți pe scurt clasa RandomAccesFile
11