LU2IN002 Cours10 Flux
LU2IN002 Cours10 Flux
1 Flux
Lecture/écriture dans un ux : principales étapes
2 Fiabilité du code
Annotations : @Override...
Assertions
1 Flux
Lecture/écriture dans un ux : principales étapes
Entrée :
La classe File
La classe FileInputStream
La classe DataInputStream
Lecture/écriture en caractères ou en octets ?
La classe BufferedReader
La classe Scanner Sortie :
2 Fiabilité du code
Il s'agit d'outils essentiels dès que l'on souhaite : les ux entrants pour la lecture
classe InputStream pour lire des octets
Saisir des informations depuis clavier
classe Reader pour lire des caractères
Écrire sur la console les ux sortants pour l'écriture
mais aussi : classe OutputStream pour écrire des octets
Lire/écrire des chiers
classe Writer pour écrire des caractères
F Quelles sont les principales étapes pour la lecture ou La classe File permet de créer un objet représentant un chier
l'écriture dans un ux ?
Nombreuses opérations très intéressantes boolean exists()
Exemple : lecture / écriture de données dans un chier (=ux) concernant la manipulation des chiers : boolean isDirectory()
1 Vérier l'existence du chier, les droits en lecture et/ou
boolean isFile()
test d'existence
boolean canWrite()
écriture...
distinction chier/répertoire boolean delete()
2 Ouvrir (si besoin créer) le chier en lecture et/ou écriture eacement File[] listFiles()
3 Lire/Écrire des données dans le chier ...
boolean mkdir()
Si besoin, vider les buers ...
Exemple :
4 Fermer le chier 1 F i l e f = new F i l e ( " t a t o o i n e . d a t " ) ;
2 if ( f . e x i s t s () ) {
F D'autres ux se gèrent comme les chiers : clavier, réseau, 3 ...
4 }
BD...
4 new File(...) = création d'un objet de la classe File qui
représente un chier, ne crée pas un chier
Exemple : lecture d'octets dans un fichier Les petits pièges... La fermeture des fichiers
Etapes 2 et 4 : ouvrir, ... et fermer F Où fermer le chier ?
F Quelle classe utiliser pour lire des octets dans un chier ? A Toujours fermer un chier qui a été ouvert...
=⇒ La classe FileInputStream (car la source est un chier ⇒ 1 try {
préxe File et lire des octets ⇒ InputStream) 2 FileInputStream in = new FileInputStream ( f );
3 . . . // LECTURE
il y a des exceptions à gérer 4 in.close();
il faut penser à fermer les chiers ouverts
5 } catch ( . . . ) {
6 ...
1 F i l e f = new F i l e ( " t a t o o i n e . d a t " ) ; 7 }
2 FileInputStream in = null ;
3 try { B ... même s'il y a des erreurs pendant la lecture !
4 i n = new F i l e I n p u t S t r e a m ( f ) ; // ouverture du chier 1 FileInputStream in = null;
5 // t h r o w s : F i l e N o t F o u n d E x c e p t i o n : => t r y / c a t c h 2 try {
6
3 i n = new F i l e I n p u t S t r e a m ( f ) ;
7 // i n s t r u c t i o n s de LECTURE dans l e f i c h i e r 4 . . . // LECTURE
8
5 in.close();
9 } catch ( FileNotFoundException e ) { 6 } catch ( . . . ) {
10 ... 7 in.close();
11
8 }
12 } finally {
13 if ( i n != n u l l ) { 4 Bien mettre la déclaration en dehors du try, sinon ça ne
14 in.close(); // fermeture du chier compilera pas !
15 }
}
© ©
16
2021-2022 C. Marsala / V. Guigue LU2IN002 - POO en Java 9/34 2021-2022 C. Marsala / V. Guigue LU2IN002 - POO en Java 10/34
Les petits pièges... La fermeture des fichiers Lecture d'octets dans un fichier (suite)
F Quelle classe pour écrire des entiers, réels, caractères... ? Exemple d'utilisation (Oracle Java Tutorials) :
Package java.io
F Comment lire/écrire des caractères ?
Classe File : créer un objet pour représenter un chier
gérer un chier ou un répertoire (créer, lire,...)
Flux :
Diérence entre caractères...
ux entrant : input
Fichiers de textes
• classes abstraites : InputStream (général), Reader (caractères)
• accès : FileInputStream (octet), FileReader (caractères) Entêtes des chiers ... et données stockées en
ux sortant : output XML, HTML... octets
• classes abstraites : OutputStream (général), Writer (caract.)
Parfois pour quelques Fichiers de chires
• accès : FileOutputStream (octet), FileWriter (caractères)
chires Volume
Accès de haut niveau à un ux
lorsque la précision n'est Précision
lecture : DataInputStream pas importante
écriture : DataOutputStream pour les chiers CSV...
© 2021-2022 C. Marsala / V. Guigue LU2IN002 - POO en Java 19/34 © 2021-2022 C. Marsala / V. Guigue LU2IN002 - POO en Java 20/34
public String readLine() throws IOException Une fois la ligne lue, il peut être nécessaire de la traiter...
Reads a line of text. A line is considered to be terminated by any one of a line
Séparer les mots : classe StringTokenizer du package
feed or a carriage return.
java.util
Returns: A String containing the contents of the line, not including any
line-termination characters, or null if the end of the stream has been reached choix des séparateurs (espace, tabulation, virgule...), accès aux
Throws: IOException - If an I/O error occurs sous-chaines
Conversion avec les méthodes des classes enveloppes
1 BufferedReader in = null ;
2 FileReader fr = null ; Exemple : dans la classe Double
try {
3
S t r i n g buf = " 1.5 " ;
4 f r = new F i l e R e a d e r ( " t a t o o i n e . t x t " ) ; //lecture de caractères 6=octets double x = Double . v a l u e O f ( b u f ) ;
5 i n = new B u f f e r e d R e a d e r ( f r ) ;
6 Méthodes similaires avec les classes Integer, Float,...
7 S t r i n g b u f = i n . readLine ( ) ;
8 w h i l e ( b u f != n u l l ){
9 System . out . p r i n t l n ( b u f ) ;
10 b u f = i n . readLine ( ) ;
11 }
12 }...
© 2021-2022 C. Marsala / V. Guigue LU2IN002 - POO en Java 21/34 © 2021-2022 C. Marsala / V. Guigue LU2IN002 - POO en Java 22/34
caractères : encore plus souple : Scanner Par défaut, le séparateur est un espace mais on peut le changer...
1 s . useDelimiter (" ," );
© 2021-2022 C. Marsala / V. Guigue LU2IN002 - POO en Java 23/34 © 2021-2022 C. Marsala / V. Guigue LU2IN002 - POO en Java 24/34
Programme Enjeux du cours
1 Flux
1 Objectif 1 : code compilé = code fonctionnel
les erreurs de compilation sont les plus faciles à corriger...
2 Fiabilité du code respectons les règles de développement
Annotations : @Override... utilisons des outils pour provoquer des erreurs de
Assertions compilation si le code prend mauvaise tournure...
annotations (aide au compilateur)
2 Objectif 2 : en cours d'exécution, détectons les erreurs et
informons l'utilisateur
fonctionnement des ruptures (exceptions)
déclenchement, traitement....
3 Vers la programmation par contrat (assertions)
Pour éviter les erreurs, respecter les règles : Vision client : accès aux contrôles comme un pilote (pédales,
Classes et méthodes de taille raisonnable, limiter les accès Vision développeur : physique complexe à gérer pour obtenir
public un comportement réaliste
les opérations complexes sont déléguées à d'autres classes
le client voit peu de choses : facile à comprendre, évite les 1 Limiter la vision public :
© 2021-2022 C. Marsala / V. Guigue LU2IN002 - POO en Java 27/34 © 2021-2022 C. Marsala / V. Guigue LU2IN002 - POO en Java 28/34
Idée
Idée
Faire en sorte de vérier un maximum de chose au niveau de la
1 Code morcelé = code plus lisible
compilation...
2 Code morcelé = code testable =⇒ plus facile à corriger
Développer plusieurs fonctions main pour tester le bon
Par défaut le compilateur vérie
fonctionnement des diérentes fonctions basiques
syntaxe (les ;, parenthèses, accolades...)
En séparant la gestion de la physique de la voiture, il devient type des variables et compatibilité avec les instances et
possible de tester chaque fonction du moteur physique... méthodes appelées
niveau d'accès (aux méthodes, variables...)
plus facile de tester/corriger des méthodes basiques plutôt que
D'autres propriétés sont plus diciles à montrer et nécessitent
l'ensemble d'une méthode très complexe
plus d'informations transmises au compilateur
NB : prémices de la programmation par contrat (cf cours L3 POO avancée)
langage d'annotations
© 2021-2022 C. Marsala / V. Guigue LU2IN002 - POO en Java 29/34 © 2021-2022 C. Marsala / V. Guigue LU2IN002 - POO en Java 30/34
Annotations standards (1/2) Annotations standards (2/2)
...
© 2021-2022 C. Marsala / V. Guigue LU2IN002 - POO en Java 31/34 © 2021-2022 C. Marsala / V. Guigue LU2IN002 - POO en Java 32/34
Une fois la compilation passée, il reste de nombreuses erreurs mécanisme des assertions permet au programmeur de vérier
possibles... dynamiquement des conditions
© 2021-2022 C. Marsala / V. Guigue LU2IN002 - POO en Java 33/34 © 2021-2022 C. Marsala / V. Guigue LU2IN002 - POO en Java 34/34