Introduction à la programmation en Java
Cours 6
Stéphane Airiau
Université Paris-Dauphine
Cours 6– (Stéphane Airiau) Java 1
Entrée et sortie
Cours 6– (Stéphane Airiau) Java 2
Entrée / sortie
Entrée/sortie : échange de données entre le programme et une source :
entrée : au clavier, lecture d’un fichier, communication réseau
sortie : sur la console, écriture d’un fichier, envoi sur le réseau
ë Java utilise des flux (stream en anglais) pour abstraire toutes ses opé-
rations.
de manière générale, on observera trois phases :
1- ouverture du flux
2- lecture/écriture du flux
3- fermeture du flux
Cours 6– (Stéphane Airiau) Java 3
Fi
le
Fi
Cours 6– (Stéphane Airiau)
le
I np
ut
Ob St
je re
ct a m
In
pu
InputStream
tS
tr
ea
Bu m
ff
ere
In dR
ea Ob
Fi
pu
de j ec
tS
le tr r t
Reader
Re ea
ad mR
er ea
Fi de
le r
Ou
tp
Ob ut
je St
ct re
Ou am
tp
ut
le package java.io (fragment)
OutputStream
St
re
Bu am
ff
er
ed
Ou Wr
tp it
Fi ut er
le St
Writer
Wri re
te am
r Wr
it
er
Java
4
La classe Files
La classe Files permet de manipuler des fichiers et répertoire
nom, chemin absolu, répertoire parent
s’il existe un fichier d’un nom donné en paramètre
droit : l’utilisateur a-t-il le droit de lire ou d’écrire dans le fichier
la nature de l’objet (fichier, répertoire)
la taille du fichier
obtenir la liste des fichiers
effacer un fichier
créer un répertoire
accéder au fichier pour le lire ou l’écrire
Cours 6– (Stéphane Airiau) Java 5
Fi
le
Fi
le
In
Cours 6– (Stéphane Airiau)
pu
Ob tS
je tr
ct ea
In m
pu
InputStream
tS
tr
ea
Bu m
ff
er
ed
In Re Ob
pu ad je
Fi tS er
le ct
tr
Reader
R ea ea
de mR
r ea
Fi de
le r
Ou
tp
Ob ut
je St
ct re
Ou am
tp
ut
OutputStream
St
re
Bu am
ff
er
ed
Ou Wr
tp it
Fi ut er
le St
Writer
Wri re
te am
r Wr
it
er
Java
6
Flux
Les flux transportent des bytes ou des char.
Direction du Flux :
objets qui gèrent des flux d’entrée : in
ë InputStream, FileInputStream, FileInputStream
objets qui gèrent des flux de sortie : out
ë OutputStream, FileOutputStream, FileOutputStream
Source du flux :
fichiers : on pourra avoir des flux vers ou à partir de fichiers
ë FileInputStream et FileOutputStream
objets : on pourra envoyer/recevoir un objet via un flux
ë ObjectInputStream et ObjectOutputStream
Cours 6– (Stéphane Airiau) Java 7
Obtenir un flux de Bytes
Obtenir un flux : le plus facile, avec une méthode static.
flux de ou vers un fichier
InputStream in = Files.newInputStream(path);
OutputStream out = Files.newOutputStream(path);
path est un chemin sur votre ordinateur.
Path p = Paths.get("/", "home", "stephane");
La méthode get de la classe Paths va former un chemin avec les chaînes
passées en argument (et va séparer avec le séparateur pour les répertoire) et
va donner un objet de type Path.
Il y a des choses pour regarder les chemins relatifs ou absolus.
flux de ou vers internet
URL url = new URL("http://www.lamsade.dauphine.fr");
InputStream in = url.openStream();
venant d’un tableau de byte
byte[] bytes = . . .
InputStream in = new ByteArayInputStream(bytes);
Cours 6– (Stéphane Airiau) Java 8
Lire un flux de bytes
read() lit un seul byte ! (retourne -1 si la fin de l’output n’a pas été
atteinte)
readAllBytes() lit toutes les bytes possibles et les place dans un
tableau
byte[] tab = in.readAllBytes() ;
Pour un fichier, on a directement
byte[] tab = Files.readAllBytes(path) ;
lire quelques bytes read(byte[], int, int) ou
readNBytes(byte[],int, int) readNbbytes va attendre
d’avoir lu n bytes, alors que read va retourner moins de bytes s’il échoue
Cours 6– (Stéphane Airiau) Java 9
Ecrire un flux de bytes
écrire un seul byte
int b = 17;
out.write(b);
écrire tous les éléments d’un tableau de bytes
byte[] tab = . . .
out.write(tab);
out.write(tab, start, length);
il existe pas mal de méthodes utilitaires : par exemple, transférer
depuis un fichier
Files.copy(path, out);
Cours 6– (Stéphane Airiau) Java 10
Un mot sur l’encodage
comment les caractères sont encodés en bytes ?
java utilise le standard Unicode UTF -8, UTF-16 encode les "points
code" en bit.
Javautilise UTF-16 qui utilise un ou deux mots de 16bit chacun.
quelques interprétations différentes du standard. Quelques
programmes (dont MS NotePad) ajoute un byte en début d’un
fichier pour aider à décoder, mais Javane le prend pas en compte...
il n’y a pas de moyen fiable de reconnaître un encodage
ëessayer de bien spécifier l’encodate (ex : Content-Type dans le
header d’une page web)
classe Charset
String s = new String(bytes, StandardCharSets.UTF_8);
Cours 6– (Stéphane Airiau) Java 11
Processus de lecture et d’écriture
Lecture
InputStreamReader BufferedReader
InputStream
tampon mémoire
flux de bytes flux de caractères
’h”e”l”l”o”
0100101101101 lecture ’h”e”l”l”o”\n’ stockage ’m”y” ”n”a”
et dans un
transformation tampon
bytes → char
Ecriture
BufferedWriter OutputStreamWriter
écriture OutputStream
’h”e”l”l”o” flux de caractères flux de bytes
écriture stockage ’h”e”l”l”o”\n”m”y’ 0100101101101
’m”y” ”n”a” mémoire tampon
écriture dans
un flux de caractères → char
Selon le type de la source ou de la destination (fichier, objet), on utilisera
FileReader à la place de InputStreamReader
FileOutputStream ou ObjectOutputStream comme implémentation
de la classe abstraite OutputStream
Cours 6– (Stéphane Airiau) Java 12
Lire du Texte
Reader reader = new InputStreamReader(inStream, charset) ;
lire les symboles un par un
int s = in.read();
pas très utilisé en pratique
lire tout un texte
String contenu = new String(Files.readAllBytes(path), charset);
récupérer une séquence de ligne
List<String> lines = Files.readAllLines(path,charset);
N.B. On expliquera ce List<String> bientôt, c’est juste une liste contenant
des chaînes de caractères.
Cours 6– (Stéphane Airiau) Java 13
Lire du Texte
Pour lire des nombres, utilisez la classe Scanner
Scanner scan = new Scanner(path,"UTF-8");
double value = scan.nextDouble();
Pour lire du texte petit à petit, on peut utiliser un BufferedReader.
En particulier, la classe possède une méthode readLine() pour lire
ligne par ligne.
Cours 6– (Stéphane Airiau) Java 14
Ecrire du Texte
On utilise un Writer
OutputStream out = . . .
Writer write = new OutputStreamWriter(out, charset);
out.write("We all live in a yellow submarine");
pour écrire dans un fichier
Writer write = Files.newBufferedWriter(path,charset);
Il est plus pratique d’utiliser PrintWriter car il contient des
méthodes familières
print, println, printf
pour écrire dans un fichier
PrintWriter writer =
new PrintWriter(Files.newBufferedWriter(path,charset));
pour écrire dans un autre flux
PrintWriter writer =
new PrintWriter(new OutputStreamWriter(out,charset));
Cours 6– (Stéphane Airiau) Java 15
Expressions régulières
On peut utiliser des expressions régulières pour lire ou chercher du texte.
ici, on donne un seul exemple pour découper du texte avec split, une
méthode de la classe String.
String line = . . .
String[] parts = line.split(";”)
cette line va mettre dans un tableau de chaîne de caractères les morceaux
délimités par ;.
Cours 6– (Stéphane Airiau) Java 16
Envoi d’objets
But : envoyer toute l’information d’un objet
ë mécanisme de « sérialisation »
la classe doit implémenter l’interface Serializable
l’interface Serializable n’a pas de méthodes : c’est juste un
marqueur.
Java transforme l’objet automatiquement en un code pas lisible
pour les humains
NB : Si un attribut de la classe est un objet d’une classe MaClasse
MaClasse est « sérialisable » : 4
MaClasse n’est pas « sérialisable » : on peut utiliser le mot-clé
transient pour indiquer de ne pas enregistrer cet attribut
Cours 6– (Stéphane Airiau) Java 17
Exemple
1 IrreductibleGaulois panoramix =
2 new IrreductibleGaulois("Panoramix", 1.75);
3
4 ObjectOutputStream oos =
5 new ObjectOutputStream(
6 new FileOutputStream(
7 new File("panoramix.txt")));
8
9 oos.writeObject(panoramix);
10 oos.close();
11
12 ObjectInputStream ois =
13 new ObjectInputStream(
14 new FileInputStream(
15 new File("panoramix.txt")));
16
17 IrreductibleGaulois copyPanoramix =
18 (IrreductibleGaulois) ois.readObject();
19 System.out.println(copyPanoramix.nom);
20 ois.close();
N.B. Le code n’est pas correct (gestion des exceptions)
Cours 6– (Stéphane Airiau) Java 18
Lire depuis la console, afficher sur la console
System.in :
entrée « standard »
objet de type InputStream
System.out :
sortie « standard »
objet de type PrintStream qui hérite de OutputStream
La classe Scanner permet de récupérer ce que vous tapez
1 Scanner scan = new Scanner(System.in);
2 int n = scan.nextInt();
3 double x = scan.nextDouble();
4 String s = scan.nextLine();
Cours 6– (Stéphane Airiau) Java 19
Exceptions et entrée/sortie
1 try {
2 FileInputStream fis = new FileInputStream(new File("test.txt"));
3 byte[] buf = new byte[8];
4 int nbRead = fis.read(buf);
5 System.out.println("nb bytes read: " + nbRead);
6 for (int i=0;i<8;i++)
7 System.out.println(Byte.toString(buf[i]));
8 fis.close();
9
10 BufferedReader reader =
11 new BufferedReader(new FileReader(new File("test.txt")));
12 String line = reader.readLine();
13 while (line!= null){
14 System.out.println(line);
15 line = reader.readLine();
16 }
17 reader.close();
18 } catch (FileNotFoundException e) {
19 e.printStackTrace();
20 }
21 catch(IOException e){
22 e.printStackTrace();
23 }
Cours 6– (Stéphane Airiau) Java 20