Documente Academic
Documente Profesional
Documente Cultură
OBIECT
Limbajul şi platforma Java
Programare II. C7
Motto
2
Persistența orientată-obiect
● Problema:
○ Definiție: restaurarea obiectelor (stărilor obiectelor) între sesiuni
diferite (secvențiale, paralele) ale aplicației în care sunt
instanțiate/re-activate.
○ Concept: “Persistența” obiectelor.
● Categorii, soluții și tehnologii:
○ Formatul stării obiectelor (formatul datelor) în mediul persistent:
■ format brut binar - binary code;
■ format semi-structurat - character/textual (CSV, XML, JSON);
■ format structurat - SQL.
○ Mediul de persistență:
■ bazat pe fișiere;
■ bazat pe baze de date (SQL sau NoSQL).
4
Studiu de caz 2: CSV File-based Repository*
● Format date:
○ Semistructurat: CSV
● Tehnologii implicate
○ FileReader -FileWriter
○ BufferedReader - BufferedWriter
○ java.io.File API
● Componenta arhitecturală:
○ Clasa DAO:
■ ProiecteCsvDAO
○ Mediu concret de persistență:
■ Fișier local: Proiecte_Releases_Aggregate.csv
5
Studiu de caz 3: SQL-based Repository*
● Format date:
○ Structurat: SQL
● Tehnologii implicate
○ JDBC
● Componenta arhitecturală:
○ Clasa DAO:
■ ProiecteJdbcDAO
○ Mediu concret de persistență:
■ Server baze de date: PostgreSQL
6
Capitolul 7. Platforma Java:
I/O API și lucru cu fișiere
Java IO, Java File NIO
Agenda
❏ (1) Studiu de caz (problema reprezentativă)
❏ (2) Java I/O: Stream-uri de Input/Output
❏ Overview Stream-uri sau canale de transmitere IO
❏ Principalele API-uri:
❏ Input/OutputStream, FileReader/Writer
❏ Probleme comune
❏ Citire/Scriere linii în fișiere
❏ Citire/Scriere date (primitive) în fișiere
❏ Citire/Scriere obiecte în fișiere (serializare obiecte)
8
Java Development Platforms
● Java Standard Platform cu Java Runtime Engine
● Jakarta/Java Enterprise Edition Platform
● Android Mobile Platform cu Android Runtime
9
Cadrul de lucru și bibliotecile Java I/O
● Interfețele de programare (API-uri) ale platformei Java
Standard (parte a JDK) privind canalele I/O:
○ Java I/O;
○ Java File I/O (incl. NIO.2.0).
● Problema avută în vedere: comunicarea/transmiterea
datelor din/spre spațiul de memorie tranzient al JRE
din/spre (re)surse externe ce pot asigura persistență:
○ fișiere locale;
○ consola implicită a mediului de execuție;
○ (re)surse la distanță (în rețea sau remote).
10
1. Studiu de caz: problema concretă
● Problema: copiere date din fișier sursă către fișier
destinație.
● Etape lucru cu date I/O
○ deschidere flux intrare din fișier sursă: FileInputStream,
FileReader;
○ citire date în buffer intern: InputStream;
○ localizare/creare fișier destinație: FileOutputStream,
FileWriter;
○ scriere date din buffer intern în fișier extern: OutputStream;
○ închidere resurse accesate try(with-resources){ };
○ test flux I/O:
■ deschidere fișier extern;
■ afișare conținut la consola standard: Sys.out.
● Clasa de testare: Test0_Init_IOStreams
11
2. Java I/O: Stream-uri de Input/Output
● Privire generală stream-uri sau canale de transmitere IO.
● Principalele API-uri:
○ InputStream/OutputStream,
○ Reader/Writer.
● Probleme comune
○ Citire/Scriere linii în fișiere
○ Citire/Scriere date (primitive) în fișiere
○ Citire/Scriere obiecte în fișiere: persistență prin
serializare obiecte în fișiere.
12
Java I/O Streams
13
Modelul Standard Java I/O
● Categoriile de canale de comunicare constau în:
○ streams (fluxuri de intrare sau ieșire)
○ pipes (fluxuri de intrare-ieșire).
● Categoriile de (re)surse accesate constau în:
○ surse de date
○ destinații (sinks).
● Formatele de comunicare a datelor constau în:
○ octeți (bytes);
○ caractere;
○ valori primitive;
○ obiecte (în format binar).
14
Clase comune
pentru
Stream-uri I/O
15
Clase pentru stream-uri de intrare
16
Clase pentru stream-uri de intrare
17
Stream-urile Standard ale JRE
18
Stream-urile Standard ale JRE
public class System {
public static PrintStream out; // the standard output
public static InputStream in; // the standard input
public static PrintStream err; // the standard error
// ... ...
}
19
Overview Stream-uri de Input/Output
● Un stream I/O este un canal de preluare|transmitere date
din|spre o sursă|destinație (sink).
● Categorii de date I/O pot fi:
○ brute: bytes, characters;
○ structurate/tipizate: primitive(numerice), șiruri de caractere;
○ obiecte: instanțe clase-tipuri abstracte de date.
● Tipuri de stream-uri I/O pot fi
○ Stream-uri orientate pe date binare (bytes):
■ de intrare/citire: InputStream;
■ de ieșire/scriere: OutputStream;
○ Stream-uri orientate pe caractere: Readers, Writers.
● Categorii de surse|destinații (aplicații)
○ orientate pe fișiere;
○ orientate pe consolă;
○ bazate pe socket-uri (comunicare în rețea - la distanță - remote).
20
Compunere Stream-uri
21
Înlănțuire stream-uri: combinații comune
Stream inițial Stream intermediar Stream final
FileReader BufferedReader
FileWriter BufferedWriter
22
Modelul Standard Java I/O: Categorii de stream-uri
● După criteriul direcției de comunicare: stream-urile de
intrare/ieșire se împart în:
○ InputStream, Reader;
○ OutputStream, Writer;
● După criteriul formatului se împart în:
○ binar: InputStream, OutputStream;
■ ObjectInputStream, ObjectOutputStream;
○ bazat pe caractere: Reader, Writer.
● După criteriul naturii sursei/destinației se împart în:
○ pentru fișiere locale: FileInputStream, FileOutputStream; FileReader,
FileWriter;
○ pentru consola standard: System.in, System.out;
○ pentru rețea: Socket::getInputStream(), Socket::getOutputStream().
23
InputStream API
● Operații citire date binare:
○ int read() citește un singur octet sau -1;
○ int read(byte[ ] buffer) citește conținut din fișier în buffer;
○ int read(byte[ ] buffer, int offset, int length).
● Operații de gestiune flux de date:
○ int available()
○ void close()
○ long skip(long l)
24
OutputStream API
● Operații scriere date binare
○ void write(int c) scrie un singur octet;
○ void write(byte[ ] buffer) scrie conținut buffer în fișier;
○ void write(byte[ ] buffer, int offset, int length);
● Operații de gestiune flux de date
○ void flush();
○ void close();
25
Reader API
● Operații citire date de tip caracter
○ int read() citește un singur caracter sau -1;
○ int read(char[ ] buffer) citește conținut din fișier în buffer;
○ int read(char[ ] buffer, int offset, int length).
● Operații de gestiune flux de date
○ void close()
○ void ready()
○ long skip(long l)
26
Writer API
● Operații scriere date de tip caracter
○ void write(int c) scrie un singur caracter;
○ void write(char[ ] buffer) scrie conținut buffer în fișier;
○ void write(char[ ] buffer, int offset, int length);
○ void write(String string) scrie valoare String în fișier;
○ void write(String string, int offset, int length);
● Operații de gestiune flux de date
○ void flush();
○ void close();
27
Use case (1): Stream-uri pentru
citire/scriere linii în fișiere
● Problema: citire/scriere conținut din/în fișiere sursă ca
linii-șiruri de caractere delimitate.
● Etape flux I/O:
○ Deschidere flux intrare din fișier sursă: FileReader;
○ Citire date în buffer intern: BufferedReader :: readLine();
○ Localizare/creare fișier destinație: FileWriter;
○ Scriere date din buffer intern în fișier extern:
BufferedWriter :: append(), newLine();
○ Închidere resurse accesate try(with-resources){ };
○ Test flux I/O:
■ deschidere fișier extern;
■ afișare conținut la consola standard: PrintStream.
● Clasa de testare: Test1_CharLinesStreams
28
Use case (2): Stream-uri pentru
citire/scriere date în fișiere
● Problema: citire/scriere date din/în fișiere sursă și
afișare consolă
● Etape flux I/O
○ Deschidere flux intrare fișier sursă: FileInputStream;
○ Citire date în buffer intern:
■ DataInputStream :: readInt(), readUTF();
■ Scanner :: nextInt(), next();
○ Localizare/creare fișier destinație: FileOutputStream;
○ Scriere date din buffer intern în fișier extern:
DataOutputStream :: writeInt(), writeUTF();
○ Închidere resurse accesate try(with-resources){ };
○ Test flux I/O:
■ deschidere fișier extern;
■ afișare conținut la consola standard: PrintStream.
● Clasa de testare: Test2_DataStreams
29
Use case (3.v1): Stream-uri pentru
citire/scriere obiecte în fișiere
● Problema: serializare obiecte
● Etape flux I/O
○ Deschidere flux intrare fișier sursă: FileInputStream;
○ Citire date în buffer intern:
■ ObjectInputStream :: readObject();
■ Scanner;
○ Localizare/creare fișier destinație: FileOutputStream;
○ Scriere date din buffer intern în fișier extern:
ObjectOutputStream :: writeObject();
○ Închidere resurse accesate try(with-resources){ };
○ Test flux I/O:
■ deschidere fișier extern;
■ afișare conținut la consola standard: PrintStream.
● Clasa de testare: Test3_ObjectFileStreams
30
Use case (3.v2): Stream-uri pentru
citire/scriere obiecte ObjectStream-DAO
● Problema: serializare obiecte
● Etape flux DAO în clasa ProiecteSerializabileDAO
○ Inițializare DAO
■ FileInputStream
○ Interogare DAO
■ FileInputStream
■ ObjectInputStream
○ Salvare obiecte
■ ObjectOutputStream
■ FileOutputStream
○ Test flux I/O:
■ deschidere fișier extern;
■ afișare conținut la consola standard: PrintStream.
● Clasa de testare: Test3_DAO_ObjectStream
31
Use case (3.v3): Stream-uri pentru
citire/scriere obiecte File Reader/Writer DAO
● Problema: serializare obiecte
● Etape flux DAO în clasa ProiecteCsvDAO
○ Inițializare DAO
■ FileWriter
○ Interogare DAO
■ FileReader
■ BufferedReader
○ Salvare obiecte
■ BufferedWriter
■ FileWriter
○ Test flux I/O:
■ deschidere fișier extern;
■ afișare conținut la consola standard: PrintStream.
● Clasa de testare: Test3_DAO_CsvFormat
32
2. Lucru cu (sisteme de) fișiere
● Overview Java File I/O API (incl. NIO)
● Principalele API-uri:
○ java.io.File,
○ java.nio.Files,
○ java.nio.Path,
○ java.nio.Paths,
○ java.nio.FileSystem
● Probleme comune
○ Use-case gestiune fluxuri I/O cu instanțe File,
○ Use-case gestiune fluxuri I/O cu instanțe Path.
33
Concepte privind lucru cu sistemele de fișiere
● Sisteme de fișiere (niv. S.O)
● Căi
● Fișiere
● Directoare
● Symbolic-Links (legături-simbolice)
○ Soft-Links
○ Hard-Links
34
Overview Java File I/O
java.io.File
Java Char Sequences
java.io.File
35
Overview Java File I/O
java.io.File
java.io.File
36
Overview Java File I/O
java.io.File
Java Data Types
java.io.File
37
java.io.File Class API
Reprezentare fișiere și directoare
new File(String pathname) Constructor: reprezentare internă Java obiect-fișier sau director
după calea pathname
boolean isAbsolute() Verifică dacă calea pathname este absolută sau relativă
File[] listFiles() Returnează un array File[] pentru un director obținut din pathname
38
java.io.File Class API
Manipulare fișiere și directoare
new File(String pathname) Constructor: reprezentare internă Java obiect-fișier sau director
după calea pathname
boolean createNewFile() Creează un fișier nou gol după calea pathname și returnează true
pentru success
boolean mkdir() Creează un director nou gol după calea pathname și returnează
true pentru success
boolean renameTo(File dest) Redenumește fișier după calea pathname a fișierului dest
39
Java File NIO API
● Căile (către fișiere sau directoare) sunt reprezentate cu
ajutorul claselor Path și Paths.
● Fișierele sunt manipulate cu ajutorul clasei Files.
● Reprezentarea sistemului de fișiere cu FileSystem.
40
java.nio.file.Path Class API
Reprezentare fișiere și directoare
Nume operații statice Descriere java.io.File operation
41
java.nio.file.Files Class API
Manipulare fișiere și directoare
Nume operații statice Descriere java.io.File operation
boolean notExists(Path p)
boolean deleteIfExists(Path p)
Path copy(Path src, Path dest, Copiază fișierul/director reprezentat prin parametrul src în dest cu
CopyOption opt...) opțiunile posibile REPLACE_EXISTING, COPY_ATTRIBUTES,
NOFOLLOW_LINKS
Path move(Path src, Path dest, Mută fișierul/director reprezentat prin renameTo()
CopyOption opt...) parametrul src în dest
42
java.nio.file.Files Class API
Manipulare fișiere și directoare
Nume operație statice Descriere java.io.File operation
43
java.nio.file.FileSystem API
Interfața suport pentru obiecte Path
44
Cazuri comune de utilizare Java File NIO
● Directoare
○ Consultare
○ Creare
● Fișiere
○ Căutare
○ Copiere, Mutare
● Fișiere de proprietăți
○ AppConfig.properties
45
Use case 4: java.io.File
● Creare instanță File din string path
○ construire InputStream, OutputStream pentru a citi/scrie un File
● Etape flux I/O
○ Deschidere flux intrare fișier sursă: FileInputStream din File;
■ creare fișier File :: createNewFile();
○ Citire date în buffer intern:
■ ObjectInputStream; Scanner;
○ Localizare fișier destinație: FileOutputStream din File;
○ Scriere date din buffer intern în fișier extern:
ObjectInputStream;
○ Închidere resurse accesate try(with-resources){ };
○ Test flux I/O: deschidere fișier extern ;
■ afișare conținut la consola standard: PrintStream.
● Clasa de testare: Test4_DataStreamsFileFromPath
46
Use case 5: Paths and Files
● Crează fișier folosind o instanță Path, scrie cu
Files.newBufferedWriter(Path), citește cu
Files.lines(Path)
● Etape flux I/O
○ Localizare fișier cu: Paths.get(Path);
■ Creare fișier cu Files.createFile(Path);
○ Citire date Files.lines();
○ Scriere date din buffer intern BufferedWriter
■ Obținut cu Files.newBufferedWriter(Path)
○ Închidere resurse accesate try(with-resources){ };
○ Test flux I/O:
■ localizare fișier extern Paths.get(Path);
■ afișare conținut la consola standard: PrintStream.
● Clasa de testare: Test5_StringLineFileFromPath
47
Referinte și tutoriale on-line
Java IO.APIs
● Tutorialspoint: JavaIO
● How To Do In Java: Java IO Tutorial
● Baeldung: JavaIO Tutorial
● JournalDev: JavaIO Tutorial și Java NIO Tutorial
● Oracle Technology Network Essentials Java IO
● Jata-T-Point Java I/O Tutorial
● DZone
○ Java File I/O Basics
○ Java IO and NIO
48