• Aucun résultat trouvé

PAQUETAGES STANDARDS

Les 4 catégories de flu

• flux d'octets : classes abstraites InputStream et OutputStream • flux de caractères : classes abstraites Reader et Writer

• principales méthodes de lecture :

– int read() : prochain élément du flux (ou -1 si « fin de flux ») – intread(byte[]buf) pour InputStream

et int read(char[] buf) pour Reader – long skip(long nb) : saute nb éléments – void close()

• principales méthodes d'écriture : – void write(int c)

– void write (byte[] / char[] buf) – pour Writer : void write(String s) – void flush()

– void close()

29/03/2011 16:09

Programmation avec le langage Java – N. Kajler, F. Moutarde – CCSI 274

Les flux « concrets » • lecture/écriture (séquentielle) dans fichiers :

FileInputStream/FileOutputStream, FileReader/FileWriter

nom du fichier spécifié dans le constructeur : new FileReader(filename) • lecture/écriture dans tableau en mémoire :

ByteArrayInput(/Output)Stream CharArrayReader/CharArrayWriter

tableau donné dans le constructeur : new CharArrayReader(tab), récupéré par toByteArray() (resp. toCharArray())

• lecture/écriture dans une chaîne : StringReader/StringWriter

chaîne donnée dans le constructeur (new StringReader(ch)), ou récupérée par toString()

• enchaînements de flux (« pipes ») :

PipedInputStream/PipedOutputstream, PipedReader/PipedWriter

29/03/2011 16:09

Programmation avec le langage Java – N. Kajler, F. Moutarde – CCSI 275

Conversions pour flux binaire

• pour lire/écrire autre chose que des octets ou caractères, on utilise des classes avec d’autres méthodes, qui font la conversion avec les flux « concrets » de bas niveau :

• flux données binaires (types primitifs) : DataInputStream/DataOutputStream

– couche au-dessus d'un flux d'octets

(new DataOutputStream(outStream), ...) – méthodes de lecture : readFloat(), readInt(),...

et écriture : writeFloat(x), writeInt(i),... • flux données binaires (objets persistants) :

ObjectInputStream / ObjectOutputStream – couche au-dessus d'un flux d'octets

– mêmes méthodes que DataXXXStream + Object readObject()

(resp. writeObject(o))

– objets doivent être de classe implantant l'interface Serializable

29/03/2011 16:09

Autres conversions de flux

• flux « avec tampon » (pour éviter des accès disque ou réseau à chaque lecture/écriture) :

BufferedInputStream / BufferedOutputStream, BufferedReader / BufferredWriter

• flux pour écriture formatée en mode texte (comme pratiqué sur System.out) : classe PrintWriter

avec comme méthodes utiles : print(), println(),

printf() ...

• flux compressés : paquetage java.util.zip

(classes ZipInputStream, ZipOutputStream,...)

• conversion flux octets / flux caractères :

InputStreamReader/OutputStreamWriter

29/03/2011 16:09

Programmation avec le langage Java – N. Kajler, F. Moutarde – CCSI 277

En pratique : écriture d'un fichier « texte »

1/ Importer les classes nécessaires : import java.io.*;

2/ Ouvrir un flux de caractères vers un fichier :

FileWriter out = new FileWriter("nomFichier"); 3/ Ecrire les caractères et/ou chaînes de caractères sur ce flux :

out.write(ch); // ch peut être : // - un char // - une String 4/ Fermeture du flux :

out.close();

Remarque : chaque étape (sauf l’import) est susceptible de lancer une IOException donc mettre les instructions à risque dans un bloc try/catch :

try { //... } catch(IOException e) { //... }

(ou bien, utiliser une clause throws) .

29/03/2011 16:09

Programmation avec le langage Java – N. Kajler, F. Moutarde – CCSI 278

En pratique : lecture d'un fichier « texte » 1/ Importer les classes nécessaires :

import java.io.*;

2/ Ouvrir un flux de caractères depuis un fichier :

FileReader in = new FileReader("nomFichier"); 3/ Lire caractère par caractère sur ce flux :

ch = in.read();

// ch vaut -1 en fin de fichier 4/ Fermeture du flux :

in.close();

Remarques :

• Chaque étape (sauf l’import) peut lancer une IOException bloc try/catch (ou throws) .

• Pour lire des nombres ou toutes donnés structurées écrites sous forme texte, utiliser la classe Scanner :

import java.util.Scanner; Scanner sc = new Scanner(in); double val = sc.nextDouble();

. . .

29/03/2011 16:09

Programmation avec le langage Java – N. Kajler, F. Moutarde – CCSI 279

En pratique : écriture d'un fichier « binaire »

1/ Importer : import java.io.*; 2/ Ouvrir un flux d'octets vers un fichier :

FileOutputStream out =

new FileOutputStream("nomFichier"); 3/ Brancher un flux d'écriture d'objets sur le flux d'octets :

ObjectOutputStream objOut =

new ObjectOutputStream(out); 4/ Ecrire les nombres et/ou objets sur ce flux :

objOut.writeInt(i); // i entier objOut.writeFloat(x); // x flottant // ...

objOut.writeObject(o);

// o objet d'une classe qui implante l'interface Serializable

5/ Fermeture des flux : objOut.close();

Remarque : chaque étape (sauf l’import) peut lancer une IOException bloc try/catch (ou clause throws) .

29/03/2011 16:09

En pratique : lecture d'un fichier « binaire » 1/ Importer : import java.io.*;

2/ Ouvrir un flux d'octets depuis un fichier :

FileInputStream in = new FileInputStream("nomFichier"); 3/ Brancher un flux de lecture d'objets et de données sur le flux d'octets :

ObjectInputStream objIn = new ObjectInputStream(in); 4/ Lire les nombres et/ou objets sur ce flux :

int i = objIn.readInt(); float x = objIn.readFloat(); // …

Object o = objIn.readObject(); 5/ Fermeture des flux :objIn.close(); Remarques :

• Chaque étape (sauf l’import) peut lancer une IOException bloc try/catch (ou throws) .

• Penser à convertir ce que retourne readObject() dans le bon type (celui de l’objet écrit à cet endroit du fichier).

29/03/2011 16:09

Programmation avec le langage Java – N. Kajler, F. Moutarde – CCSI 281

Lecture/ecriture simultanées et non-séquentielles sur fichier

• Possible via classe RandomAccessFile

• constructeur : RandomAccessFile(filename,mode)

mode valant "r" (readonly) ou "rw" (read/write)

• écrire sur le fichier :

raf.writeInt(i); // i entier raf.writeFloat(x);// x flottant raf.writeUTF(s); // s String //…

• lire sur le fichier :

int i = raf.readInt(); float x = raf.readFloat(); String s = raf.readUTF(); String l = raf.readLine(); //…

• taille : int len = raf.length()

• déplacement dans le fichier : raf.seek(pos);

29/03/2011 16:09

Programmation avec le langage Java – N. Kajler, F. Moutarde – CCSI 282

Classes utilitaires pour entrées-sorties

• StreamTokenizer : pour découpage de flux de caractères en « jetons (ou tokens) » de type mot, nombre, blanc ou caractère

– constructeur : StreamTokenizer(Reader r) – lecture jeton suivant : int nextToken()

(renvoie et met dans le champ ttype le type du jeton parmi TT_WORD, TT_NUMBER, TT_EOL, TT_EOF, et met le nombre dans le champ nval, ou la chaîne dans le champ sval le cas échéant)

• File : pour manipuler fichiers/répertoires (accès à la taille, listage du contenu, suppression, renommage, …)

– constructeurs :

File(String name), File(String path, String name), ... – méthodes :

• boolean exists(), long length(), File getParent() • boolean isDirectory(), String[] list()

• void delete(), void mkdir(), • boolean renameTo(File f), ...

29/03/2011 16:09

29/03/2011 16:09

Programmation avec le langage Java – N. Kajler, F. Moutarde – CCSI 285 Programmation avec le langage Java – N. Kajler, F. Moutarde – CCSI 29/03/2011 16:09 286

29/03/2011 16:09

Paquetage java.util :

COLLECTIONS,

Documents relatifs