0% ont trouvé ce document utile (0 vote)
2 vues55 pages

Gestion des Entrées/Sorties en Java

poo

Transféré par

Mohamed Trabelsi
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
2 vues55 pages

Gestion des Entrées/Sorties en Java

poo

Transféré par

Mohamed Trabelsi
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

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

Vous aimerez peut-être aussi