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,