• Aucun résultat trouvé

Connecter un flux ` a un fichier

N/A
N/A
Protected

Academic year: 2022

Partager "Connecter un flux ` a un fichier"

Copied!
20
0
0

Texte intégral

(1)

Chapitre VII : Les flux en Java, interractions avec le syst` eme d’exploitation

Eric Leclercq

13 avril 2005

Eric Leclercq Chapitre VII : Les flux en Java, interractions avec le syst`eme d’exploitation

(2)

Le mod`ele de flux

Flux et fichiers

Persistance d’objet et s´erialisation

Connecter un flux `a une ressource Web

(3)

Principes et d´ efinitions

I Les entr´ees / sorties sont organis´ees en Java autour du concept de flux ou flot (anglais stream)

I Un flux est une suite de valeurs (octets, caract`eres, objets quelconques) successivement lues ou ´ecrites

I Les flux sont classifi´es en :

I flux d’entr´ee qui comportent des m´ethodes de lecture

I flux de sortie qui comportent des m´ethodes d’´ecriture

I Un flux d’entr´ee est connect´e `a une source, un flux de sortie `a une cible. La source ou la cible d’un flux peuvent ˆetre un fichier, un tampon en m´emoire, une chaˆıne de caract`eres, un autre flux, une connexion r´eseau

Eric Leclercq Chapitre VII : Les flux en Java, interractions avec le syst`eme d’exploitation

(4)

Principes et d´ efinitions

I Les fluxs les plus basiques sont des flux d’octets (flux binaires)

I Les classes des flux d’octets en ´ecriture respectivement lecture ont un nom avec suffixeOutputStream respectivement InputStream

I Pour travailler avec des flux de caract`eres Unicode, il faut utiliser les classes du suffixesWriteret Reader

(5)

Lecture et ´ ecriture des flux binaires

Les m´ethodes g´en´erales de lecture sur un flux d’octets sont :

I int read() lit l’octet suivant disponible sur le flux (se bloque en l’attendant), le retourne dans un int (valeur entre 0 et 255), retourne -1 si la fin du flux est atteinte

I int read(byte b[])lit au plus b.lengthoctets du flux, les place dans le tableau b, et retourne le nombre d’octets lus ou bien -1 si la fin du flux est atteinte

Les m´ethodes g´en´erales d’´ecriture sur un flux d’octets sont :

I void write(int c)´ecrit un octet, repr´esent´e par un int

I void write(byte[] b)´ecrit lesb.lengthoctets de b

I void flush() vide le buffer associ´e au flux

Eric Leclercq Chapitre VII : Les flux en Java, interractions avec le syst`eme d’exploitation

(6)

Connecter un flux ` a un fichier

I La lecture et l’´ecriture d’octets sur un fichier se fait `a l’aide des classesFileInputStream etFileOutputStream import java.io.*;

class CopieBinaireFichier {

public static void main(String[] args) throws IOException {

...

int c;

...

if (args.length > 0) in = new FileInputStream(args[0]);

if (args.length > 1) out = new FileOutputStream(args[1]);

while ((c = in.read()) != -1) out.write(c);

in.close();

out.close();

}

(7)

Association de flux

I La classe DataOutputStream offre des m´ethodes plus

´

evolu´ees que FileOutputStream

I Elle propose des m´ethodes pour envoyer des types primitifs dans le flux : writeIntetc.

I L’exemple suivant montre l’enrichissement, l’association et la connexion de flux

I Un objet de type file peut ˆetre utilis´e dans les constructeurs de flux

...

FileOutputStream f = new FileOutputStream("fic.dat");

DataOutputStream sortie = new DataOutputStream(f);

...

DataOutputStream sortie = new DataOutputStream(

new FileOutputStream("fic.dat");

... Eric Leclercq Chapitre VII : Les flux en Java, interractions avec le syst`eme d’exploitation

(8)

Obtenir des propri´ et´ es d’un fichier

I java.io.File est utile pour obtenir diverses propri´et´es des fichiers :

I savoir si un chemin d´esigne un fichier ordinaire ou un r´epertoire

I savoir si l’objetest accessible en lecture ou en ´ecriture, etc.

File cheminRepertoire =

new File("/usr/local/java/docs");

File cheminFichier =

new File(cheminRepertoire, "index.html");

...

if (cheminRepertoire.isDirectory() &&

cheminFichier.canRead()) { ...

}

(9)

Fichiers ` a acc` es direct

I Si un acc`es direct `a une position quelconque du fichier est n´ecessaire, on devra utiliser la classeRandomAccessFile

I Fonctionne `a la fois en ´ecriture et en lecture

I Un cuseur permet de se d´eplacer dans le fichier

I Il faut lui adjoindre un index pour trouver les ´el´ements

I Il faut ˆetre capable de d´eterminer (calculer) la position d’un

´

el´ements en fonction de sa taille

I Utiliser le m´ethode seek(int)

Eric Leclercq Chapitre VII : Les flux en Java, interractions avec le syst`eme d’exploitation

(10)

Lire et ´ ecrire sur un flux de caract` eres

I Les fluxde caract`eres sont des objets de classeReaderou Writer

I Les m´ethodes read etwrite de ces classes sont analogues `a celles op´erant sur des flux d’octets, `a la diff´erence que c’est un caract`ere 16 bits qui est lu ou ´ecrit, et non un octet

I La conversion entre un flux d’octets et un flux de caract`eres se fait au moyen des classes OutputStreamWriteret InputStreamReader

I Le principe est l’association de flux : connecter un flux d’octets `a un flux de caract`eres

I InputStreamReader isr = new InputStreamReader(System.in) ;

I Pour connecter un flux de caract`eres `a un fichier, si la conversion n’est pas n´ecessaire, il est plus simple de recourir aux classe FileWriteret FileReader

(11)

Connecter un flux ` a un tampon

I Les op´erations individuelles de lecture ou d’´ecriture peut ˆetre tr`es coˆuteuse

I C’est le cas des acc`es `a un fichier, ou des acc`es au r´eseau

I Pour ´eviter des op´erations individuelles sur un octet ou sur un caract`ere `a la fois, on utilise un tampon (anglais buffer)

I Pour ´ecrire sur un fichier on ´ecrira sur un flux bufferis´e

I Les classes qui mettent en oeuvre les buffers sont :

I BufferedInputStreametBufferedOutputStreampour les flux binaires

I BufferedReaderetBufferedWriterpour les flux de caract`eres

Eric Leclercq Chapitre VII : Les flux en Java, interractions avec le syst`eme d’exploitation

(12)

Connecter un flux ` a un tampon

I Un flux de caract`eres de la classe BufferedReaderpropose des op´erations suppl´ementaires (par exemple, lecture d’une ligne de texte).

BufferedReader in =

new BufferedReader(new FileReader("toto"));

String s = in.readline();

I De fa¸con similaire pour ´ecrire dans un fichier, il est pr´ef´erable de travailler avec un tampon :

PrintWriter out = new PrintWriter(

new BufferedWriter(

new FileWriter("toto")));

out.println("un long texte");

(13)

Lire et ´ ecrire des donn´ ees brutes sur un flux binaire

I pour lire et ´ecrire, non pas des octets, mais des valeurs d’un type connu, il faut utiliser les classesDataInputStreamet

DataOutputStream

I Ces classes disposent de m´ethodes sp´ecialis´ees pour les types primitifs :readInt(),readDouble(),readChar(),

readBoolean()(et les m´ethodes writeXYZ correspondantes) DataOutputStream dos = new DataOutputStream(

new FileOutputStream(’toto.dat’));

...

dos.writeBoolean(false);

dos.writeInt(400);

...

dos.close();

I eme exemple pour lire un entier sur l’entr´ee standard : DataInputStream dis =

new DataInputStream(System.in);

int n = dis.readInt();

Eric Leclercq Chapitre VII : Les flux en Java, interractions avec le syst`eme d’exploitation

(14)

Lire et ´ ecrire des donn´ ees par blocs

I Les flux peuvent ˆetre utilis´es afin de lire ou d’´ecrire des donn´ees par bloc (tableau d’octets)

I Supposons que l’on dispose d’un tableau d’octets data re¸cu par exemple d’une connexion r´eseau :

I On sait que ce tableau contient un bool´een et un entier

I On utilise les flux des classesDataInputStreamet ByteArrayInputStream

byte[] data = ...;

DataInputStream dis = new DataInputStream(

new ByteArrayInputStream(data));

...

boolean b = dis.readBoolean();

int n = dis.readInt();

dis.close();

(15)

Lire et ´ ecrire des donn´ ees par blocs

I Le tableau doit continir des donn´ees cod´ees de fa¸con compatible avec le d´ecodage r´ealis´e

I Ce sera le cas sym´etriquement si le tableau d’octets a ´et´e obtenu par les classes DataOutputStream et

ByteArrayOutputStream byte[] data;

ByteArrayOutputStream baos = new ByteArrayOutputStream();

DataOutputStream dos = new DataOutputStream(baos);

dos.writeBoolean(true);

dos.writeInt(4);

data = baos.toByteArray();

dos.close();

Eric Leclercq Chapitre VII : Les flux en Java, interractions avec le syst`eme d’exploitation

(16)

Principes

I Les classes ObjectOutputStreametObjectInputStream permettent de rendre persistants des objets de Java en les sauvegardant au travers d’un flux associ´e `a un fichier

I Le flux peut aussi ˆetre associ´e `a une connexion r´eseau

I Seuls les objets dont la classe impl´emente l’interface Serializable peuvent b´en´eficier de ce m´ecanisme

I Si un objet comporte des membres qui sont des r´ef´erences `a d’autres objets ces objets persistent aussi.

ObjectOutputStream s =

new ObjectOutputStream(new FileOutputStream("toto.dat"));

s.writeObject("Aujourd’hui");

s.writeObject(new Date());

(17)

Principes

La lecture de ces objets, qui se fait dans le mˆeme ordre que leur

´ecriture,doit op´erer une coercition (transtypage ou casting) du typeObjectvers la classe que l’on veut restituer :

ObjectInputStream s =

new ObjectInputStream(new FileInputStream("toto"));

String chaine = (String)s.readObject();

Date date = (Date)s.readObject();

Eric Leclercq Chapitre VII : Les flux en Java, interractions avec le syst`eme d’exploitation

(18)

Un exemple

I Le programme exemple suivant connecte un flux d’entr´ee `a une URL (vue comme un fichier)

I Il transforme ce flux d’octets en un flux de caract`eres et le place dans un tampon

I Les lignes successivement lues en entr´ee sont copi´ees sur la sortie standard (jusqu’`a ce quereadLineretourne null)

(19)

Un exemple

import java.net.*;

import java.io.*;

class URLReader {

public static void main(String[] args) throws MalformedURLException, IOException { URL url = new URL("http://kundera/index.html");

BufferedReader in = new BufferedReader(

new InputStreamReader(

url.openStream()));

String ligne;

while ((ligne = in.readLine()) != null) System.out.println(ligne);

in.close();

} }

Eric Leclercq Chapitre VII : Les flux en Java, interractions avec le syst`eme d’exploitation

(20)

Pour continuer...

I La classe Hashtable permet de stocker des valeurs en les associant `a des identificateurs uniques calcul´es `a partir des cl´es

I Les cl´es et valeurs ne doivent pas poss`eder la valeur null, mais en revanche peuvent ˆetre des objets de n’importe quel type

I ⇒ s´erialiser le hastable pour g´erer le base de donn´ee des couples motcl´es, URL du projet

Références

Documents relatifs

Quelles sont les caract´eristiques observ´ees sur le march´e pour les produits spot et forward que le mod`ele 2 facteurs permet de reproduire?. Quels effets ne permet-il pas

On suppose que l’on observe seulement le nombre de particules dans le r´ecipient A au cours du temps, et que l’on d´esire estimer le nombre total de particules. Et construire

C’est le cas des acc` es ` a un fichier, ou des acc` es au r´ eseau Pour ´ eviter des op´ erations individuelles sur un octet ou sur un caract` ere ` a la fois, on utilise un

C’est le cas des acc` es ` a un fichier, ou des acc` es au r´ eseau Pour ´ eviter des op´ erations individuelles sur un octet ou sur un caract` ere ` a la fois, on utilise un

La source ou la cible d’un flux peuvent ˆ etre un fichier, un tampon en m´ emoire, une chaˆıne de caract` eres, une connexion r´ eseau, un autre flux.... Organisation

Cette approche pr´esente deux difficult´es num´eriques majeures : suivre avec pr´ecision l’´evolution de l’interface solide-liquide et r´esoudre efficacement la convection

 Un flux est créé à partir d'un autre (par « wrapping ») : il traite les mêmes données mais avec un traitement supplémentaire..  Codage des données dans un

Sur ce syst`eme mod`ele, nous montrons que, du point de vue entr´ee/sortie et sous l’hypoth`ese standard des petites oscillations, il n’y a pas de diff´erence entre des