UE 2I002 (ex LI230) : éléments de programmation par objets avec Java
TD11 - Flux
!!
!
Juliana Silva Bernardes
juliana.silva_bernardes@upmc.fr
http://www.lcqb.upmc.fr/julianab/teaching/JAVA/
2
!
‣Flux de lecture /écriture
‣Manipulation (création, lecture,écriture, . . .)
Sumary
La classe File
‣ Le paquetage java.io d efinit un grand nombre de classes pour g ́ erer les entr ́ es / ́ sorties d’un programme
2i002 – Introduction `a la Programmation Objet page 175
11 Manipulation de flux entr´ ee / sortie
Objectifs
– Gestion d’arborescences de fichiers – Flux de lecture / ´ecriture
– Manipulation (cr´eation, lecture, ´ecriture, . . .) de fichiers textuels – Mise en m´emoire tampon
– Entr´ee / Sortie standard Propositions :
TD : Exo 71 sur les objets File, Exo 72 (au moins questions 2,3 et 4), Exo 73 sur la copie de fichiers, Exo 74 sur la mise en m´emoire tampon, Exo 75 (Production de compte rendu de TME) et Exo 76 autour de la classe Clavier
TME : Finaliser Exo 72 sur le traitement de texte et realiser l’Exo 75 sur la production automatique de compte rendu de TME
La classe File
Le paquetage java.io d´efinit un grand nombre de classes pour g´erer les entr´es / sorties d’un programme. Parmi elles, la classe File permet de manipuler des fichiers ou des r´epertoires. Une instance de la classe File est une repr´esentation logique d’un fichier ou d’un r´epertoire qui peut ne pas exister physiquement sur le disque. La classe File d´efinit notamment les m´ethodes suivantes :
- File(String path) construit un objet File pointant sur l’emplacement pass´e en param`etre - boolean canRead() indique si le fichier peut ˆetre lu
- boolean canWrite() indique si le fichier peut ˆetre modifi´e
- boolean createNewFile() cr´ee un nouveau fichier vide `a l’emplacement point´e par l’objet File, createNewFile() peut lever l’exception java.io.IOException
- boolean delete() d´etruit le fichier ou le r´epertoire
- boolean exists() indique si le fichier existe physiquement - String getAbsolutePath() renvoie le chemin absolu du fichier
- File getParentFile() renvoie un objet File pointant sur le chemin parent de celui de l’objet File courant - boolean isDirectory() indique si l’objet File pointe sur un r´epertoire
- boolean isFile() indique si l’objet File pointe sur un fichier
- File[] listFiles() si l’objet File est un r´epertoire, renvoie la liste des fichiers qu’il contient - boolean mkdir() cr´eation du r´epertoire
- boolean mkdirs() cr´eation de toute l’arborescence du chemin - boolean renameTo(File f) renomme le fichier
Exercice 71 – Manipulation de fichiers et d’arborescences Soit la classe TestFile suivante :
4
import java.io.File;
!
public class TestFile {
public static void main(String[] args) { File f=new File(args[0]);
System.out.println(f.getAbsolutePath()) ; } }
La classe File
$ java TestFile file1.txt
/Users/julianab/Documents/Aulas/UPMC/2015-2016/JAVA/TD11/classes/file1.txt
import java.io.File;
!
public class TestFile {
public static void main(String[] args) { File f=new File(args[0]);
System.out.println(f.getAbsolutePath());
System.out.println("Le fichier existe: “+
(f.exists()?"oui":"non"));
} }
La classe File
java TestFile file1.txt
/Users/julianab/Documents/Aulas/UPMC/2015-2016/JAVA/TD11/classes/file1.txt Le fichier existe : non
6
import java.io.File;
!
public class TestFile {
public static void main(String[] args) { File f=new File(args[0]);
System.out.println(f.getAbsolutePath()) ; System.out.println("Le fichier existe: “+
(f.exists()?”oui":"non"));
f.createNewFile() ; } }
La classe File
$ javac TestFile.java
TestFile.java:10: error: unreported exception IOException; must be caught or declared to be thrown f.createNewFile() ;
^
1 error
import java.io.File;
import java.io.IOException;
!
public class TestFile {
public static void main(String[] args) { try {
File f=new File(args[0]);
System.out.println(f.getAbsolutePath()) ; System.out.println("Le fichier existe : “+
(f.exists()?"oui":"non"));
f.createNewFile() ;
System.out.println("Le fichier existe : “+
(f.exists()?"oui":"non"));
}catch (IOException e ) {
System.out.println("Error" + e.getMessage());
} } }
La classe File
$ java TestFile file1.txt
/Users/julianab/Documents/Aulas/UPMC/2015-2016/JAVA/TD11/classes/file1.txt Le fichier existe : non
Le fichier existe : oui
8
import java.io.File;
import java.io.IOException;
!
public class TestFile {
public static void main(String[] args) { try {
File f=new File(args[0]);
System.out.println(f.getAbsolutePath()) ;
System.out.println("Le fichier existe : “+
(f.exists()?"oui":"non"));
f.createNewFile() ;
System.out.println("On peut le lire : “+
(f.canRead()?"oui":"non"));
System.out.println("On peut le ecrire :”+
(f.canWrite()?"oui":"non"));
}catch (IOException e ) {
System.out.println("Error" + e.getMessage());
} } }
La classe File
$ java TestFile file1.txt
/Users/julianab/Documents/Aulas/UPMC/2015-2016/JAVA/TD11/classes/file1.txt Le fichier existe : oui
Le fichier existe : oui On peut le lire : oui On peut le ecrire : oui
import java.io.File;
import java.io.IOException;
!
public class TestFile {
public static void main(String[] args) { File f=new File(args[0]);
f.mkdir();
} }
La classe File
$ java TestFile dir1
Julianas-Air:classes julianab$ ls
TestFile.class TestFile.java dir1 file1.txt
10
Flux
‣ Java possède une multitude de classes permettant la manipulation de flux de lecture/
écriture.
Deux categories de flux :
– Les flux entrants pour la lecture – InputStream pour lire des octets – Reader pour lire des caractères – Les flux sortants pour l’écriture
– OutputStream pour écrire des octets – Writer pour écrire des caractères
11
Flux d’entrée
'MVY EFOUSÏF
*M BSSJWF TPVWFOU EFOSFHJTUSFS EFT EPOOÏFT EBOT EFT ĕDIJFST UFYUFT *M QFVU BMPST ÐUSF VUJMF EVUJ MJTFS VO PV VO QPVS FČFDUVFS MB MFDUVSF %BOT MFT FYFNQMFT TVJWBOUT PO DPOTJEÒSF VOF NBUSJDF 10 × 10 FOSFHJTUSÏF EBOT VO ĕDIJFS UFYUF MJHOF QBS MJHOF BWFD MFT DPMPOOFT TÏQBSÏFT QBS EFT FTQBDFT
‣ Lecture de caractères.
12
‣ La classe BufferReader permet de lire plus que un caractère à la fois, une ligne du ficher par exemple.
'MVY EFOUSÏF
*M BSSJWF TPVWFOU EFOSFHJTUSFS EFT EPOOÏFT EBOT EFT ĕDIJFST UFYUFT *M QFVU BMPST ÐUSF VUJMF EVUJ MJTFS VO PV VO QPVS FČFDUVFS MB MFDUVSF %BOT MFT FYFNQMFT TVJWBOUT PO DPOTJEÒSF VOF NBUSJDF 10 × 10 FOSFHJTUSÏF EBOT VO ĕDIJFS UFYUF MJHOF QBS MJHOF BWFD MFT DPMPOOFT TÏQBSÏFT QBS EFT FTQBDFT
Flux d’entrée
‣ Un flux de sortie est une instance d’une sous-classe de
OutputStream.
‣ Chaque classe de flux de sortie a son propre mode d’écriture de données.
‣ ByteArrayOutputStream permet d’écrire des octets vers le flux de sortie;
‣ DataOutputStream permet d’écrire des types de données primitifs de Java vers le flux de sortie.
‣ FileOutputStream est utilisé pour écrire dans un fichier.
‣ ObjectOutputStream permet d’écrire des objets si ces objets implémentent les interfaces
Serializableou
Externalizable.
‣ Writer représente un flux de sortie pour chaînes de caractères.
Flux de sortie
14
Flux de sortie
$IBQJUSF (FTUJPO EFT FOUSÏFTTPSUJFT TJNQMFT
0O QFVU ÏHBMFNFOU VUJMJTFS VO DPNNF VO QPVS ÏDSJSF EFT DIBÔOFT EF DBSBDUÒSFT EBOT VO ĕDIJFS BTTF[ TJNQMFNFOU %BOT MFYFNQMF TVJWBOU PO ÏDSJU VOF TÏSJF EF 10 MJHOFT EF 10 FOUJFST BMÏBUPJSFT TÏQBSÏT QBS EFT FTQBDFT EBOT VO ĕDIJFS QPVWBOU ÐUSF MV QBS MB DMBTTF
Flux de sortie
‣ La classe BufferWriter permet de écrire plus que un caractère à la fois, une ligne dans le ficher par exemple.
!
String ligne ;
int nombre = 123;
try{
FileWriter f = new FileWriter(destination);
BufferedWriter fichier = new BufferedWriter(f);
fichier.write("bonjour tout le monde");
fichier.newLine();
fichier.write("Nous sommes le "+ new Date());
fichier.write(", le nombre magique est " + nombre);
fichier.close();
} catch (Exception e) { e.printStackTrace();
}
16
Flux de sortie
Les fichiers à accès direct
18