Entrées/Sorties
Karima Boudaoud
IUT- R&T
Entrées / Sorties
Fonctionnement par flots (stream)
Karima Boudaoud IUT GTR-Sophia Antipolis 2
Entrées / Sorties
Terrain connu
la classe [Link]
cette classe gère l’interface avec le système d'exploitation
[Link]("Accrochez-vous !");
3 flots standards
[Link]; // entrée à la console
[Link]; // affichage à l'écran
[Link]; // affichage à l'écran
ce sont des objets static
Karima Boudaoud IUT GTR-Sophia Antipolis 3
[Link]
Type
c’est un objet de type [Link]
Caractéristiques
produit un flot d'octets formaté pour affichage
possède une méthode print pour chaque type
print(int i); // octets pour entier
print(double d); // octets pour double
print(char c); // octets pour caractère
...
print(Object o); // [Link]()
Karima Boudaoud IUT GTR-Sophia Antipolis 4
[Link]
idem que [Link]
permet d’indiquer des erreurs
Karima Boudaoud IUT GTR-Sophia Antipolis 5
[Link]
Type
c’est un objet de type [Link]
Caractéristiques
comme pour OutputStream, il propose une
fonctionnalité de base
possède une seule méthode
public int read(); // lit un octet
attend le prochain octet en entrée
retourne 0 < son code < 255
si plus rien, renvoie -1
Karima Boudaoud IUT GTR-Sophia Antipolis 6
Exemple
import [Link].*;
public class Naif {
public static void main(String[] args) throws IOException {
int b, nb = 0;
// lecture de caractères au clavier
while((b = [Link]()) != -1) {
nb++;
[Link]((char) b);
}
[Link]("nb = " + nb);
}
le résultat peut surprendre...
Karima Boudaoud IUT GTR-Sophia Antipolis 7
Object Paquetage [Link]
InputStream
Lecture d'octets
Lecture et écriture de flots d’octets
OutputStream
Ecriture d'octets
Reader
Lecture de caractères Unicode
Lecture et écriture de flots de
Writer caractères Unicode
Ecriture de caractères Unicode
File
Maniement de noms de fichiers Pour représenter fichiers et répertoires
et de répertoires
StreamTokenizer Analyse lexicale d’un flot d’entrée
Analyse lexicale d'un flot d'entrée
Karima Boudaoud IUT GTR-Sophia Antipolis 8
Lecture de flots d’octets
Hiérarchie des principales classes de lecture d’un flot d’octets
Doit être sous- InputStream
classée Classe abstraite de base
FilterInputStream FileInputStream ObjectInputStream
Décorateur Lecture d'un fichier Lecture d'un objet sérialisé
BufferedInputStrea
Entrées bufférisées
DataInputStream
Lecture des types primitifs
Karima Boudaoud IUT GTR-Sophia Antipolis 9
Écriture de flots d’octets
Hiérarchie des principales classes d’écriture d’un flot
d’octets
Doit être sous- OutputStream
classée Classe abstraite de base
FilterOutputStream FileOutputStream ObjectOutputStream
Décorateur Ecriture d'un fichier Ecriture d'un objet sérialisé
BufferedOutputStream
Sorties bufférisées
DataOutputStream
Ecriture de types primitifs
PrintStream
Utilisé par [Link]
Ne pas utiliser autrement
Karima Boudaoud IUT GTR-Sophia Antipolis 10
Lecture et écriture de flots
d’octets
Classe pour entrée Classe pour sortie Fonctions fournies
InputStream OutputStream Classes abstraites de base
pour lecture et écriture d’un
flot de données
FilterInputStream FilterOutputStream Classe mère des classes qui
ajoutent fonctionnalités à
Input/OutputStream
BufferedInputStream BufferedOutputStream Lecture et écriture avec
buffer
DataInputStream DataOutputStream Lecture et écriture des types
primitifs
FileInputStream FileOutputStream Lecture et écriture d’un
fichier
PrintStream Possède les méthodes
print(), println()
utilisées par [Link]
Karima Boudaoud IUT GTR-Sophia Antipolis 11
Package [Link]
Le package [Link] fournit des classes
permettant de manipuler diverses ressources
fichiers
mémoire
tuyaux (pipes)
filtres
Karima Boudaoud IUT GTR-Sophia Antipolis 12
Les Fichiers
les classes manipulant les fichiers se trouvent
dans la classe [Link]
il existe trois classes principales
FileInputStream
FileOutputStream
RandomAccessFile
Karima Boudaoud IUT GTR-Sophia Antipolis 13
[Link] (1)
la classe [Link] fournit de
nombreuses méthodes pour gérer des fichiers
et répertoires
String getName()
String getPath()
String getAbsolutePath()
String getParent()
boolean renameTo(File newName)
Karima Boudaoud IUT GTR-Sophia Antipolis 14
[Link] (2)
Droits d'accès
boolean exists()
boolean canWrite()
boolean canRead()
...
Autres informations
long length()
long lastModified()
boolean delete()
...
Karima Boudaoud IUT GTR-Sophia Antipolis 15
[Link] (3)
...
File f = new File("[Link]");
[Link]("[Link] : "
+ [Link]() + " " + [Link]());
if ([Link]()) {
[Link](
"Fichier existe, droits = "
+ [Link]() + " " + [Link]()
+ " " + [Link]());
...
}
..
Karima Boudaoud IUT GTR-Sophia Antipolis 16
[Link] (4)
Répertoires
boolean mkdir()
String[] list()
File f = new File("/u/I3S/buffa", ".emacs");
// ou bien
File home = new File("/u/I3S/buffa");
File f = new File(home, ".emacs");
Karima Boudaoud IUT GTR-Sophia Antipolis 17
Package [Link] (1)
Mémoire
BufferedInputStream
BufferedOutputStream
pour les lectures bufférisées
DataInputStream
DataOutputStream
lectures typées
utile pour lire des fichiers dont on connaît la nature exacte
– 3 doubles et un entier sur chaque ligne par exemple
Karima Boudaoud IUT GTR-Sophia Antipolis 18
Package [Link] (2)
Tuyau
PipedInputStream
PipedOutputStream
ces 2 classes permettent à deux threads d'échanger des
données.
Lecture filtrée
StreamTokenizer
Karima Boudaoud IUT GTR-Sophia Antipolis 19
[Link] (1)
Caractéristiques
la classe InputStream est une classe
abstraite
elle oblige les sous-classes à implémenter la
méthode read
Lecture d'octets uniqument
c’est la classe de base de tous les flots
d'entrée
Karima Boudaoud IUT GTR-Sophia Antipolis 20
[Link] (2)
Karima Boudaoud IUT GTR-Sophia Antipolis 21
[Link] (3)
• Infos sur quelques sous-classes
SequenceInputStream
permet de travailler avec une énumération
d'InputStreams comme s'il s'agissait d'un seul
StringBufferInputStream
lecture de chaînes de caractères
ByteArrayInputStream
lecture de tableaux d'octets
FilterInputStream
encapsule une instance d'InputStream et fournit des
méthodes de filtrage
Karima Boudaoud IUT GTR-Sophia Antipolis 22
[Link] (1)
Lecture
cette classe permet de lire des caractères ou des
octets d’un fichier
Fermeture
la fermeture d’un fichier se fait par la méthode close
Constructeurs
public FileInputStream(String filename)
public FileInputStream(File file)
Karima Boudaoud IUT GTR-Sophia Antipolis 23
[Link] (2)
Méthodes de lecture
toutes les méthodes renvoient -1 en fin de fichier
int read()
lit un octet
int read(byte[] taboctets)
remplit taboctets si possible
taboctets doit être alloué avant
int read(byte[] taboctets,int offset,int nb)
lit nb octets et les met dans taboctets à partir de l'indice offset.
Karima Boudaoud IUT GTR-Sophia Antipolis 24
[Link] (3)
FileInputStream fis;
byte[] b = new byte[1024];
try {// ouverture du fichier
fis = new FileInputStream("/u/I3S/buffa/.emacs");
} catch (FileNotFoundException e) {...}
try {// lecture des données
int i = [Link](b);
} catch (IOException e) {...}
// utilisation des caractères lus
String s = new String(b, 0);
Karima Boudaoud IUT GTR-Sophia Antipolis 25
[Link] (1)
Lecture
cette classe permet la lecture de données typées
en terme de portabilité, un entier est de même taille
partout
Classe de "spécialisation"
cette classe peut transformer en DataInputStream
n'importe quel InputStream
Constructeur
public DataInputStream(InputStream)
Karima Boudaoud IUT GTR-Sophia Antipolis 26
[Link] (2)
Méthodes de lecture
byte readByte()
short readShort()
char readChar()
int readInt()
float readFloat()
String readLine
la fin de la ligne marquée par \n, \r, \r\n, EOF
...
Karima Boudaoud IUT GTR-Sophia Antipolis 27
[Link] (3)
Fermeture de flot
la méthode qui permet de fermer un flot est la
méthode close
la fermeture de entraine la fermeture de
InputStream
Karima Boudaoud IUT GTR-Sophia Antipolis 28
[Link] (4)
// Ouverture d'un fichier
FileInputStream fis;
fis = new FileInputStream("[Link]");
// spécialisation !
DataInputStream dis = new DataInputStream(fis);
String ligne = new String();
// lecture des données
while((ligne = [Link]()) != null){
[Link](ligne + "\n");
}
[Link](); // fermeture du fichier. Ferme aussi fis !
Karima Boudaoud IUT GTR-Sophia Antipolis 29
[Link] (1)
la classe OutputStream est une classe
abstraite
elle est la de base de tous les flots de sortie
Karima Boudaoud IUT GTR-Sophia Antipolis 30
[Link] (2)
La classe PrintStream(OutputStream os)
la classe PrintStream permet d’écrire des données typées
autres que des bytes
la classe [Link] est un PrintStream
les méthodes fournies par cette classe sont
close()
flush()
write() // permet l’écriture d'octets
ces méthodes sont implémentées par les sous-classes de
OutputStream
Karima Boudaoud IUT GTR-Sophia Antipolis 31
[Link] (1)
Écriture de caractères dans un fichier
l’ouverture du fichier est faite à la construction
Le SecurityManager est appelée à chaque ouverture de
fichier
il existe des méthodes d'écriture d'octets.
la fermeture est soit explicite avec close()ou implicite
Constructeurs
public FileOutputStream(File)
public FileOutputStream(FileDescriptor)
public FileOutputStream(String)
Karima Boudaoud IUT GTR-Sophia Antipolis 32
[Link] (2)
Méthodes d’écriture
public void write(int)
public void write(byte [])
FileOutputStream fos =
new FileOutputStream("toto");
String chaine = new String("Coucou c'est moi");
int longueur = [Link]();
byte[] buffer = new byte[longueur];
[Link](0, longueur - 1, buffer, 0);
for(int i = 0; i < longueur; i++)
[Link](buffer[i]);
Karima Boudaoud IUT GTR-Sophia Antipolis 33
[Link] (1)
Écriture
l’écriture se fait sur un flot de sortie bufférisé
la spécialisation des données se fait à partir de n'importe
quel flot de sortie.
l’écriture sur disque se fait de manière explicite par la
méthode flush() ou la méthode close()
Constructeurs
BufferedInputStream(OutputStream)
BufferedOutputStream(OutputStream,int size)
Karima Boudaoud IUT GTR-Sophia Antipolis 34
[Link] (2)
Méthodes
write(int)
write(byte [], int offset, int length)
flush()
close()
Karima Boudaoud IUT GTR-Sophia Antipolis 35
[Link] (3)
// ouverture d'un fichier pour écriture en mode bufférisé
FileOutputStream fos = new FileOutputStream("[Link]");
BufferedOutputStream bos = new BufferedOutputStream(fos);
// préparation des données à écrire
String chaine = "coucou c'est moi";
int longueur = [Link]();
byte[] buffer = new byte[longueur];
[Link](0, longueur - 1, buffer, 0);
// écriture
for(int i = 0; i < longueur; i++) {
[Link](buffer[i]);
}
[Link]("\n");
[Link]();
Karima Boudaoud IUT GTR-Sophia Antipolis 36
[Link] (1)
Écriture
cette classe permet l’écriture de données typées
en terme de portabilité, un entier est de même taille partout
Classe de "spécialisation"
cette classe permet de transformer en
DataOutputStream n'importe quel OutputStream
il est conseillé de prendre un BufferedOutputStream
Constructeur
public DataOutputStream(OutputStream)
Karima Boudaoud IUT GTR-Sophia Antipolis 37
[Link] (2)
Méthodes d'écriture
byte writeByte()
short writeShort()
char writeChar()
int writeInt()
float writeFloat()
writeDouble()
writeBytes()
writeChars()
writeUTF()
Karima Boudaoud IUT GTR-Sophia Antipolis 38
[Link] (3)
Fermeture de flot
la fermeture se fait avec la méthode close()
la fermeture de DataOutputStream entraine
la fermeture de InputStream original
Karima Boudaoud IUT GTR-Sophia Antipolis 39
[Link] (4)
FileOutputStream fos =
new FileOutputStream("[Link]");
BufferedOutputStream bos =
new BufferedOutputStream(fos);
DataOutputStream dos = new DataOutputStream(bos);
[Link]("Position ");
[Link](10.0);
[Link](12.0);
[Link](7.0);
[Link]("\n");
...
Karima Boudaoud IUT GTR-Sophia Antipolis 40
Flots de caractères (1)
les flots de caractères (character streams)
ils existent depuis la JDK1.1
auparavant
les entrées/sorties ne travaillaient qu'avec des bytes
Il n’y avait que les classes InputStream et
OutputStream
les flots de caractères manipulent des caractères
au format unicode (16 bits)
il y a 2 classes principales Reader et Writer
Karima Boudaoud IUT GTR-Sophia Antipolis 41
Flots de caractères (2)
Karima Boudaoud IUT GTR-Sophia Antipolis 42
Flots de caractères (3)
Karima Boudaoud IUT GTR-Sophia Antipolis 43
Flots de caractères (4)
les classes les plus utilisées sont
InputStreamReader
BufferedReader
FileReader
PrintWriter
FileWriter
Karima Boudaoud IUT GTR-Sophia Antipolis 44
Flots de caractères (5)
Classes Reader et Writer
les classes Reader et Writer permettent,
globalement, de faire les mêmes opérations
que les classes InputStream et
OutputStream
elles supportent des fonctionnalités
similaires
FileReader <--> FileInputStream
FileWriter <--> FileOutputStream
Karima Boudaoud IUT GTR-Sophia Antipolis 45
Flots de caractères (6)
en utilisant les flots de caractères, on peut
échanger des données textuelles…
avec des accents
caractères bizarres (japonais…)
...
InputStreamReader et OutputStreamWriter
se chargent de l'encodage et du décodage
ce sont toujours des octets qui circulent
Karima Boudaoud IUT GTR-Sophia Antipolis 46
Flots de caractères (7)
les flots de caractères sont plus efficaces que
InputStream et OutputStream
les classes InputStreamReader et
OutputStreamWriter sont bufférisés en
standard
Karima Boudaoud IUT GTR-Sophia Antipolis 47
Complément sur les E/S
Karima Boudaoud
Package [Link].*
ByteArrayInputStream BufferedInputStream
FileInputStream DataInputStream
InputStream FilterInputStream LineNumberInputStream
PipedInputStream PushbackInputStream
File
SequenceInputStream
FileDescriptor StringBufferInputStream
Object
RandomAccessFile
ByteArrayOutputStream
OutputStream BufferedOutputStream
FileOutputStream
StreamTokenizer DataOutputStream
FilterOutputStream
PrintStream
PipedOutputStream
Karima Boudaoud IUT GTR-Sophia Antipolis 49
[Link]
Cette classe fournie une définition plateform-independent
des fichiers et des répertoires
File f = new File("/etc/passwd");
[Link]([Link]()); // --> true
[Link]([Link]()); // --> true
[Link]([Link]()); // --> false
[Link]([Link]()); // --> 11345
File d = new File("/etc/");
[Link]([Link]()); // --> true
String[] files = [Link]();
for(int i=0; i < [Link]; i++)
[Link](files[i]);
Karima Boudaoud IUT GTR-Sophia Antipolis 50
[Link](Input|Output)
Stream
Ces classes permettent d'accèder en lecture et en écriture à
un fichier
FileInputStream fis = new FileInputStream("[Link]");
byte[] data = new byte[[Link]()];
[Link](data);
[Link]();
FileOutputStream fos = new FileOutputStream("[Link]");
[Link](data);
[Link]();
Karima Boudaoud IUT GTR-Sophia Antipolis 51
[Link](Input|Output)
Stream
Ces classes permettent de lire et d'écrire des types primitifs et
des lignes sur des flux
FileInputStream fis = new FileInputStream("[Link]");
DataInputStream dis = new DataInputStream(fis);
int i = [Link]();
double d = [Link]();
String s = [Link]();
FileOutputStream fos = new FileOutputStream("[Link]");
DataOutputStream dos = new DataOutputStream(fos);
[Link](123);
[Link](123.456);
[Link]("Une chaine");
Karima Boudaoud IUT GTR-Sophia Antipolis 52
[Link]
Cette classe permet de manipuler un OutputStream au
travers des méthode print() et println(
PrintStream ps = new PrintStream(new
FileOutputStream("[Link]"));
[Link]("Une ligne");
[Link](123);
[Link]("Une autre ");
[Link]("ligne");
[Link]();
[Link]();
Karima Boudaoud IUT GTR-Sophia Antipolis 53
[Link](Input|Output)
Stream (1)
Ces classes permettent de lire et d'ecrire des objets,
implémentant [Link], sur des flux.
// Ecriture
FileOutputStream fos = new FileOutputStream("tmp");
ObjectOutput oos = new ObjectOutputStream(fos);
[Link]("Today");
[Link](new Date());
[Link]();
// Lecture
FileInputStream fis = new FileInputStream("tmp");
ObjectInputStream ois = new ObjectInputStream(fis);
String today = (String)[Link]();
Date date = (Date)[Link]();
Karima Boudaoud IUT GTR-Sophia Antipolis 54
[Link](Input|Output)
Stream (2)
par défaut, tous les champs sont sérialisés (y compris
private)
cela peut poser des problèmes de sécurité
il existe 3 solutions
ne pas implémenter Serializable
réécrire les méthodes writeObjet() et readObject()
le mot clé transcient permet d'indiquer qu'un champs ne doit pas
être serialisé
Karima Boudaoud IUT GTR-Sophia Antipolis 55