Programmation en Java Java IO - Tuyen Nguyen`s personal page

publicité
Programmation en Java Java IO NGUYEN Thi Minh Tuyen Paquetage Descrip9on java.applet Classes de base pour les applets java.awt Classes d'interface graphique AWT java.io Classes d entrées/sor9es (flux, fichiers) java.lang Classes de support du langage java.math Classes perme>ant la ges?on de grands nombres java.net Classes de support réseau (URL, sockets) java.rmi Classes pour les méthodes invoquées à par?r de machines virtuelles non locales java.security Classes et interfaces pour la ges?on de la sécurité java.sql Classes pour l'u?lisa?on de JDBC java.text Classes pour la manipula?on de textes de dates et de nombres dans plusieurs langages java.u?l Classes d’u?litaires (vecteurs, hashtable) javax.swing Classes d’interface graphique NGUYEN Thi Minh Tuyen Principaux paquetages fournis 2 Flux •  Caractérise un chemin (une voie) de communica9on entre une source d'informa9on et sa des9na9on. •  Traitent toujours les données de façon séquen9elle. •  Flux d'entrée (input stream) et les flux de sor?e (output stream) •  Flux de traitement de caractères (Character Stream) et les flux de traitement d'octets (Byte Stream) •  Java définit des flux pour lire ou écrire des données mais aussi des classes qui permePent de faire des traitements sur les données du flux. NGUYEN Thi Minh Tuyen •  En java, les flux peuvent être divisés en plusieurs catégories : •  Ces classes doivent être associées à un flux de lecture ou d'écriture et sont considérées comme des filtres. •  Toutes ces classes sont regroupées dans le package java.io. 3 NGUYEN Thi Minh Tuyen Flux 4 Flux d'octets Flux de caractères Flux d'entrée InputStream Reader Flux de sortie OutputStream Writer • 
• 
• 
• 
Reader : flux en lecture sur des ensembles de caractères Writer : flux en écriture sur des ensembles de caractères InputStream : flux en lecture sur des ensembles d'octets OutputStream: flux en écriture sur des ensembles d'octets NGUYEN Thi Minh Tuyen Classes de gestion des 9lux 5 Exemple: Flux d’octets try {
in = new FileInputStream("xanadu.txt");
out = new FileOutputStream("outagain.txt");
int c;
} while ((c = in.read()) != -1) {
out.write(c);
}
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
NGUYEN Thi Minh Tuyen public static void main(String[] args) throws IOException{
FileInputStream in = null;
FileOutputStream out = null;
6 7 NGUYEN Thi Minh Tuyen Exemple: Flux de caractères public static void main(String[] args) throws IOException{
FileReader inputStream = null;
FileWriter outputStream = null;
inputStream = new FileReader("xanadu.txt");
outputStream = new FileWriter("characteroutput.txt");
int c;
while ((c = inputStream.read()) != -1) {
outputStream.write(c);
}
NGUYEN Thi Minh Tuyen try {
} finally {
if (inputStream != null) { inputStream.close(); }
if (outputStream != null) { outputStream.close();}
}
} 8 Pré9ixe du 9lux Le préfixe con9ent la source ou la des9na9on selon le sens du flux. source ou destination du flux ByteArray tableau d'octets en mémoire CharArray tableau de caractères en mémoire File fichier Object objet Pipe pipeline entre deux threads String chaîne de caractères NGUYEN Thi Minh Tuyen Préfixe du flux 9 Préfixe de la classe En entrée En sor9e Mise en tampon Buffered Oui Oui Concaténa?on de flux Sequence Oui pour flux d'octets Non Conversion de données Data Oui pour flux d'octets Oui pour flux d'octets Numérota?on des lignes LineNumber Oui pour les flux de caractères Non Lecture avec remise dans PushBack le flux des données Oui Non Impression Print Non Oui Sérialisa?on Object Oui pour flux d'octets Oui pour flux d'octets Conversion octets/
caractères InputStream / OutputStream Oui pour flux d'octets Oui pour flux d'octets NGUYEN Thi Minh Tuyen Type de traitement 10 Flux en lecture Flux en sortie Flux de caractères BufferedReader CharArrayReader FileReader InputStreamReader LineNumberReader PipedReader PushbackReader StringReader BufferedWriter CharArrayWriter FileWriter OutputStreamWriter PipedWriter StringWriter Flux d'octets BufferedInputStream ByteArrayInputStream DataInputStream FileInputStream ObjectInputStream PipedInputStream PushbackInputStream SequenceInputStream BufferedOutputStream ByteArrayOutputStream DataOuputStream FileOutputStream ObjetOutputStream PipedOutputStream PrintStream NGUYEN Thi Minh Tuyen Plusieurs classes de java.io 11 NGUYEN Thi Minh Tuyen Flux de caractères 12 Méthodes Rôles boolean markSupported() indique si le flux supporte la possibilité de marquer
des positions boolean ready() indique si le flux est prêt à être lu close() ferme le flux et libère les ressources qui lui étaient
associées int read() renvoie le caractère lu ou -1 si la fin du flux est
atteinte. int read(char[]) lire plusieurs caractères et les mettre dans un
tableau de caractères int read(char[], int, int) lire plusieurs caractères long skip(long) saute autant de caractères dans le flux que la
valeur fournie en paramètre. mark() permet de marquer une position dans le flux reset() retourne dans le flux à la dernière position
marquée NGUYEN Thi Minh Tuyen Classe Reader 13 Méthodes Rôles close() ferme le flux et libère les ressources qui lui étaient
associées write(int) écrire le caractère en paramètre dans le flux. write(char[]) écrire le tableau de caractères en paramètre dans
le flux. write(char[], int, int) écrire plusieurs caractères. Elle attend en
paramètres : un tableau de caractères, l'indice du
premier caractère et le nombre de caractères à
écrire. write(String) écrire la chaîne de caractères en paramètre dans
le flux write(String, int, int) écrire une portion d'une chaîne de caractères. Elle
attend en paramètre : une chaîne de caractères,
l'indice du premier caractère et le nombre de
caractères à écrire. NGUYEN Thi Minh Tuyen Classe Writer 14 Utilisation des 9lux La communica9on avec un flux comprend trois phases : •  La répé99on de la lecture ou de l'écriture des données (généralement des bytes ou des caractères) •  La fermeture du flux NGUYEN Thi Minh Tuyen •  L'ouverture du flux, en entrée (pour la lecture) ou en sor9e (pour l'écriture) 15 Lecture et écriture des 9lux •  Pour lire un fichier texte: il faut ouvrir un flux d'entrée: •  Pour écrire un fichier texte: il faut ouvrir un flux de sor9e: •  La classe FileWriter cons?tue une des couches de base et comporte les méthodes élémentaires pour écrire le flux sur le système de fichiers •  La lecture et l'écriture de fichiers textes sont réalisées en enrobant la couche de base avec des ou9ls de plus haut niveau (imbrica9on) NGUYEN Thi Minh Tuyen •  La classe FileReader cons?tue une des couches de base et comporte les méthodes élémentaires pour lire le flux depuis le système de fichiers •  Mémoire tampon (buffer) pour minimiser les accès au disque •  Conversion bytes / caractères (encodage Unicode) •  Découpage en lignes / Inser?on des retours à la ligne, etc. 16 Écriture d'un 9ichier texte Pour écrire séquen9ellement dans un fichier de texte on peut u9liser la classe PrintWriter de la manière suivante: //Ouverture
PrintWriter p = new PrintWriter(
new BufferedWriter(new FileWriter(filename)));
//Ecriture
p.print("Hello");
NGUYEN Thi Minh Tuyen String filename = "TestOut.txt";
p.println(" world" + 3*2);
p.println("Fin du fichier " + filename);
//Fermeture
p.close(); 17 Écriture d'un 9ichier texte Des méthodes print() et println() la classe PrintWriter permePent de formater le texte écrit dans le fichier. Pour la syntaxe du texte de formatage, voir descrip9on dans l'API de la classe java.u9l.FormaPer Exemple: p.printf("%.2f", resultScore);
p.printf("Nombre %d Prix %ld Total %9ld\n",
NGUYEN Thi Minh Tuyen prinj(String format, Object... args) nbItems, price, price*nbItems);
p.printf("%5d%8.3f %n", i, v); 18 Lecture d'un 9ichier texte Pour lire séquen9ellement le contenu d'un fichier de texte on peut u9liser la classe BufferedReader de la manière suivante : //Ouverture
BufferedReader r = new BufferedReader(new FileReader(filename));
//Lecture (ligne par ligne)
String s;
s = r.readLine();
while (s != null) { //--- Tant qu'il y a encore des lignes...
System.out.println(s);
NGUYEN Thi Minh Tuyen String filename = "TestOut.txt";
s = r.readLine();
}
//Fermeture
r.close(); 19 Lecture d'un 9ichier texte La classe Scanner (dans java.u9l) offre différentes méthodes pour décomposer les données d'un flux de caractères ou d'un String: //Ouverture
String filename = "TestOut.txt";
Scanner scf = new Scanner(new BufferedReader(new
FileReader(filename)));
//Lecture
String line;
while (scf.hasNextLine()) {
line = scf.nextLine();
Scanner scs = new Scanner(line);
scs.useDelimiter("="); //--- Séparateur (regex pattern)
String key = scs.next();
float val = scs.nextFloat();
//...
System.out.println(key + " = " + val);
}
//Fermeture
scf.close(); NGUYEN Thi Minh Tuyen 20 public static void main(String[] args) throws IOException{
BufferedReader inputStream = null;
PrintWriter outputStream = null;
try {
new FileReader("xanadu.txt"));
outputStream = new PrintWriter(
new FileWriter("characteroutput.txt"));
String l;
while ((l = inputStream.readLine()) != null) {
outputStream.println(l);
NGUYEN Thi Minh Tuyen inputStream = new BufferedReader(
}
} finally {
if (inputStream != null) { inputStream.close(); }
if (outputStream != null) {outputStream.close(); }
} 21 Entrées/Sorties standard (console) Les flux suivants sont prédéfinis dans la classe System. Ces flux sont toujours ouverts et on ne les ferme pas. •  System.out Sor9e standard (affichage à l'écran) [ PrintStream ] •  System.err Sor9e des messages d'erreur [ PrintStream ]
(souvent iden9que à out par défaut) //Écriture sur la console :
System.out.print("Résultats : "); //--- Reste sur la même ligne
NGUYEN Thi Minh Tuyen •  System.in Entrée standard (lecture du clavier) [ InputStream ] System.out.println(5*4 + ", " + 6);
System.out.println(5*4 + ", " + 4+2);
System.err.println("Erreur : Nom de fichier incorrect"); 22 Lecture au clavier BufferedReader keyboard = new BufferedReader(
new InputStreamReader(System.in));
//...
String s = keyboard.readLine();
NGUYEN Thi Minh Tuyen La lecture au clavier s'effectue en imbriquant (en enrobant) le flux standard (System.in) dans deux constructeurs de classes qui se chargeront de la conversion des octets en caractères Unicode et de la mise en place d'une mémoire tampon intermédiaire. 23 Lecture au clavier Une autre manière de faire (souvent plus pra9que) est d'u9liser la classe Scanner (java.u9l) qui permet également de saisir mais, en plus, de transformer et d'interpréter ce qui a été saisi au clavier. System.out.print("Enter an integer (or 'x' to exit) : ");
while (scan.hasNextInt()) {
int i = scan.nextInt();
System.out.println("Value = " + i);
NGUYEN Thi Minh Tuyen Scanner scan = new Scanner(System.in);
System.out.print("Enter an integer (or 'x' to exit) : ");
} 24 Importation des classes I/O •  Tout programme qui u9lise des entrées/sor9es (sauf s'il se limite aux flux standard) devra préalablement importer toutes les classes externes nécessaires. •  On u9lisera pour cela la pseudo-­‐instruc9on : import java.io.*; •  CePe instruc9on doit être placée avant la déclara9on de la classe qui u9lise les entrées/sor9es (juste après package …). NGUYEN Thi Minh Tuyen •  La plupart des classes d'entrées/sor9es se trouvent dans la librairie (package) java.io •  Elle a pour effet de rendre visible toutes les classes contenues dans le paquetage java.io (importa9on sélec9ve également possible). •  Pour pouvoir u9liser la classe Scanner il faut également l'importer : import java.u9l.Scanner; 25 Traitement des exceptions •  La plupart des opéra9ons d'entrées/sor9es risquent de générer des excep9ons du type IOExcep9on (une sous-­‐classe d'Excep9on). •  Il faut éviter de mePre des instruc9ons try / catch à chaque ligne. •  Grâce au mécanisme de propaga9on des excep9ons, il est possible de concentrer le traitement à un seul endroit (ou à quelques endroits stratégiques judicieusement choisis). •  Dans les applica9ons, il faut trouver le bon compromis et placer les traitements d'excep9on aux endroits où l'on peut prendre les mesures adéquates et/ou informer correctement l'u9lisateur. NGUYEN Thi Minh Tuyen •  Ces excep9ons (contrôlées) sont déclarées dans la signature des méthodes concernées et le compilateur impose donc au programmeur de les traiter ou de déclarer leur propaga9on. •  Pas de message du genre : "Erreur d'entrée/sor?e" •  Mais plutôt un message clair : "Le fichier C:\Image\Tx1.gif n'existe pas" 26 Hiérarchie de la classe IOException La classe IOExcep9on comporte un grand nombre de sousclasses correspondant à différents types d'événements qui peuvent survenir lorsqu'on travaille avec les entrées/sor9es. java.lang.Throwable +-­‐-­‐ java.lang.Excep9on +-­‐-­‐ java.io.IOExcep9on +-­‐-­‐ ChangedCharSetExcep?on +-­‐-­‐ CharacterCodingExcep?on +-­‐-­‐ CharConversionExcep?on +-­‐-­‐ CloseChannelExcep?on +-­‐-­‐ EOFExcep?on +-­‐-­‐ FileNotFoundExcep?on +-­‐-­‐ FileLockInterrup?onExcep?on +-­‐-­‐ MalformedURLExcep?on +-­‐-­‐ ProtocolExcep?on +-­‐-­‐ SocketExcep?on +-­‐-­‐ UnknownHostExcep?on +-­‐-­‐ UnsupportedEncodingExcep?on +-­‐-­‐ ZipExcep?on +-­‐-­‐ . . . NGUYEN Thi Minh Tuyen 27 String line, filename;
BufferedReader f, keyboard;
try {
keyboard = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Entrer le nom du fichier : ");
filename = keyboard.readLine();
f = new BufferedReader(new FileReader(filename));
line = f.readLine();
while (line != null) {
if (line.charAt(0)=='#')
System.out.println("----------");
else
System.out.println(line);
line = f.readLine();
}
f.close();
}catch (IOException e) {
System.err.println("Erreur: " + e);
} NGUYEN Thi Minh Tuyen Lecture séquentielle d'un 9ichier texte 28 Décomposition des données lues •  Les données enregistrées dans des fichiers textes sont généralement structurées et nécessitent une phase d'analyse et de décomposi9on (parsing) avant de pouvoir les u9liser. •  Classes StringTokenizer et StreamTokenizer •  Classe Scanner •  Méthode split() de la classe String •  Classes Pa>ern et Matcher (package java.u?l.regex) •  La classe StringTokenizer est la plus ancienne et, si elle est parfois plus performante, elle est cependant moins flexible que Scanner ou split() qui se basent sur des Expressions régulières (regex paPern). NGUYEN Thi Minh Tuyen •  Java offre différents ou9ls pour faciliter ce travail,par exemple : 29 Spéci9ication de Scanner Scanner(InputStream source) Constructs a new Scanner that produces values scanned from the specified input stream Scanner(Readable source) Constructs a new Scanner that produces values scanned from the specified source Scanner(String source) Constructs a new Scanner that produces values scanned from the specified string Méthodes NGUYEN Thi Minh Tuyen Constructeur String findInLine(String pa>ern) A>empts to find the next occurrence of a pa>ern constructed from the specified string, ignoring delimiters boolean hasNext() Returns true if this scanner has another token in its input 30 Spéci9ication de Scanner boolean hasNextLine() Returns true if there is another line in the input of this scanner boolean hasNextXYZ() Returns true if the next token in this scanner's input can be interpreted as a XYZ String next() Finds and returns the next complete token from this scanner String next(String pa>ern) Returns the next token if it matches the pa>ern constructed from the specified string String nextLine() Advances this scanner past the current line and returns the input that was skipped XYZ nextXYZ()
NGUYEN Thi Minh Tuyen boolean hasNext(String pa>ern) Returns true if the next token matches the pa>ern constructed from the specified string Scans the next token of the input as a XYZ Scanner skip(String pa>ern) Skips input that matches a pa>ern constructed from the specified string Scanner useDelimiter(String pa>ern) Sets this scanner's delimi?ng pa>ern to a pa>ern constructed from the specified String 31 Exemple public static void main(String[] args) throws IOException{
Scanner s = null;
s = new Scanner(new BufferedReader(
new FileReader("xanadu.txt")));
while (s.hasNext()) {
System.out.println(s.next());
}
NGUYEN Thi Minh Tuyen try {
} finally {
if (s != null) { s.close(); }
}
} 32 Exemple public static void main(String[] args) throws IOException {
Scanner s = null;
double sum = 0;
try {
new FileReader("usnumbers.txt")));
s.useLocale(Locale.US);
while (s.hasNext()) {
if (s.hasNextDouble()) {
sum += s.nextDouble();
NGUYEN Thi Minh Tuyen s = new Scanner(new BufferedReader(
} else { s.next(); }
}
} finally { s.close();
System.out.println(sum);
} }
33 Spéci9ication de StringTokenizer StringTokenizer(String str) Constructs a string tokenizer for the specified string StringTokenizer(String str, String delim) Constructs a string tokenizer for the specified string StringTokenizer(String str, String delim, boolean returnDelims) Constructs a string tokenizer for the specified string Méthodes int countTokens() Calculates the number of ?mes that this tokenizer's nextToken method can be called (before raising an excep?on) boolean hasMoreElements() Returns the same value as the hasMoreTokens method boolean hasMoreTokens() Tests if there are more tokens available from this tokenizer's string NGUYEN Thi Minh Tuyen Constructeur 34 Object nextElement() Returns the same value as the nextToken method, except that its declared return value is Object rather than String String nextToken() Returns the next token from this string tokenizer String nextToken(String delim) Returns the next token in this string tokenizer's string NGUYEN Thi Minh Tuyen Spéci9ication de StringTokenizer 35 String line, filename;
StringTokenizer st;
BufferedReader f, keyboard;
try {
keyboard = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Entrer le nom du fichier : ");
filename = keyboard.readLine();
f = new BufferedReader(new FileReader(filename));
line = f.readLine();
while (line != null) {
st = new StringTokenizer(line);
while (st.hasMoreTokens()) {
System.out.print("(" + st.nextToken() + ")");
}
System.out.println();
line = f.readLine();
}
f.close();
}catch (IOException e) {
System.err.println("Erreur: " + e);
} NGUYEN Thi Minh Tuyen Exemple 36 Méthode split() •  Se base sur une expression régulière dont la syntaxe est définie dans la classe PaPern (java.u9l.regex). •  Exemple: String str = "Mots, séparés, par, des, virgules";
String[] words = str.split(", ");
for (int i=0; i<words.length; i++) {
NGUYEN Thi Minh Tuyen •  Se trouve dans la classe String, pour décomposer une chaîne de caractères System.out.println(words[i]);
} 37 Fichiers à accès direct •  Un curseur (File Pointer) peut être posi9onné à un emplacement quelconque et les opéra9ons de lecture/écriture auront lieu à par9r de cet endroit •  après l'opéra?on, le curseur sera automa?quement posi?onné après le dernier byte lu ou écrit •  Lors de l'ouverture du fichier, on indique le fichier à traiter ainsi que le mode d'accès : NGUYEN Thi Minh Tuyen •  La classe RandomAccessFile : lire et d'écrire dans un fichier à des posi9ons arbitraire (accès direct, accès aléatoire). •  "r" : lecture uniquement •  "rw" : lecture et écriture •  Si le fichier n'existe pas, il sera créé à l'emplacement indiqué (selon les paramètres du constructeur). 38 Exemple RandomAccessFile f = new RandomAccessFile("TestOut.txt", "rw");
f.seek(50); // Déplacement vers le byte 50 du fichier
byte[] data = new byte[100];
f.read(data); // Lit 100 bytes du fichier
int i = f.readInt();
// Lit un entier codé sur 4 bytes dans le fichier
f.seek(50); // Retour au byte 50
NGUYEN Thi Minh Tuyen // Crée un buffer pour contenir les données
f.writeInt(i); // Écrit d'abord l'entier…
f.write(data); // puis écrit les 100 bytes
f.close(); // Fermeture du fichier 39 •  car elle n'inclut pas de méthodes de lecture et d'écriture de chaînes de caractères assurant la conversion au format Unicode. •  La méthode readLine() permet de lire une ligne de texte mais ne fonc9onne correctement que pour du texte simple (ASCII / 8 bits). •  La méthode writeBytes() permet d'écrire du texte (String) mais ne fonc9onne correctement que pour du texte simple (ASCII / 8 bits). De plus, il faut s'assurer d'ajouter les caractères de terminaison à la fin de chaque ligne. NGUYEN Thi Minh Tuyen •  La classe RandomAccessFile : principalement des9née à la manipula9on de données binaires 40 Arguments de la ligne de commande •  En Java, un programme peut recevoir des arguments lors de son lancement (des paramètres d'exécu9on sur la ligne de commande). public static void main(String[] args){
for (int i=0; i<args.length; i++) {
System.out.println(args[i]);
}
NGUYEN Thi Minh Tuyen •  Dans le programme on récupère ces paramètres dans un tableau de chaînes de caractères (String[]) transmis à la méthode main(). if (args.length == 0)
System.out.println("No arguments");
}
}
41 Type primi9f Conversion en String Conversion de String byte toString(byte b) parseByte(String s) short toString(short s) parseShort(String s) int toString(int i) parseInt(String s) long toString(long l) parseLong(String s) float toString(float f) parseFloat(String s) double toString(double d) parseDouble(String s) D'autres fonc9ons de conversion sont également disponibles dans la classe String, notamment la méthode valueOf() qui permet de conver9r en String les valeurs de tous les types primi9fs. NGUYEN Thi Minh Tuyen Conversions types primitifs ó String 42 Exemple public static void main(String[] args){
int p1 = 0;
float p2 = 0;
double p3 = 0;
boolean p4 = false;
p1 = Integer.parseInt(args[0]);
p2 = Float.parseFloat(args[1]);
p3 = Double.parseDouble(args[2]);
p4 = Boolean.valueOf(args[3]).booleanValue();
} catch (Exception e) {
NGUYEN Thi Minh Tuyen try {
System.err.println("Incorrect Runtime Parameters Types or Values");
System.err.println("Should be : int, float, double, boolean");
return;
}
} 43 NGUYEN Thi Minh Tuyen Question? 44 
Téléchargement