Laboratoire 10 Programmation I Automne 2008 Prof. Ilham Benyahia Objectif : Les classes E/S en java Note : Plusieurs codes contiennent la classe Exception qui est requise pour manipuler les E/S mais ne fait pas partie du contenu du cours. Cette classe sera fournie et donc le laboratoire n`exige pas le développement de cette classe ni des connaissances techniques à part sa documentation (définition). La concentration se porte plutôt sur les classes E/S. Énoncé 1 : La classe File 1. Consulter java API pour se documenter sur la classe File et les méthodes appelées au niveau du code suivant. 1. Compiler exécuter le code. 3. Compléter le code pour chercher d’autres propriétés du fichier que vous testez dans votre environnement comme : la dernière modification du fichier, la taille du fichier. Code import java.io.File; class FileTest { private static void p(String s) { System.out.println (s); } public static void main (String args[ ]) { File f1 = new File ("/java/COPYRIGHT"); p("File name:" + f1.getName( ) ); p("Path:" + f1.getPath ( )); p("Abs Path:" +f1.getAbsolutePath()); p("Parent:" +f1.getParent( )); p(f1.exists() ? "exists" : "n’ existe pas"); p(f1.canWrite( ) ? "est inscriptible" : "n’est pas inscriptible"); p(f1.canRead ( ) ? "est lisible" : "n’est pas lisible"); p("is" + (f1.isDirectory() ? "n’est pas" : "une directorie")); } } Sol avec ajout des appels aux deux méthodes p("File last modified: " +f1.lastModified ()); p(" File size:" + f1.length() + "Bytes"); Énoncé 2 Tester le contenu des répertoires. Exécuter le code suivant et testez-le dans votre environnement pour lister le contenu de répertoires que vous choisissez. - code : import java.io.File; class DirList { public static void main (String args[]) { String dirname = "/java"; File f1 = new File(dirname); if (f1.isDirectory()) { System.out.println("Directorie de" + dirname); String s[] = f1.list(); for (int i=0; i<s.length; i++) { File f = new File(dirname + "/" + s[i]); if (f.isDirectory()) { System.out.println(s[i] + "est une directorie"); } else System.out.println(s[i] + "est u fichier"); } } else { System.out.println(dirname + " n’est pas une directorie"); } } } Énoncé 3 Faites une documentation des méthodes propres à la classe ByteArrayStream et expliquer ensuite le rôle de la classe testée. Code import java.io.*; import java.util.*; class ByteArrayOutputStramS { public static void main (String args[ ]) throws Exception { int i; ByteArrayOutputStream f0 = new ByteArrayOutputStream (12); System.out.println ("Entrez 10 caracteres et un retour "); while ( f0.size ( ) != 10) { f0.write(System.in.read( ) ) ; } System.out.println ("Tampon conne chaîne"); System.out.println(f0.toString ()); System.out.println(" vers un tableau "); byte b[ ] = f0.toByteArray ( ); for (i= 0; i<b.length; i++) { System.out.println( (char) b[i]); } System.out.println("vers un OutputStream()"); OutputStream f2 = new FileOutputStream ("test.txt"); f0.writeTo (f2); System.out.println ("Faire un reset"); f0.reset(); System.out.println("Entrez 10 caracteres et un retour "); while (f0.size() != 10) { f0.write(System.in.read()); } System.out.println("Fait"); } } Solution Un tableau d’octets offre à un flux de sortie (OutputStream) de nouvelles possibilités dont les méthodes de la classe ByteArrayoutputStream tirent profit. La classe ByteArrayOutputStreamS montre comment remplir ByteArrayOutputstream avec un flux d’entrée en provenance du clavier et comment manipuler le flux de sortie. Énoncé 4 1. Expliquer les fonctions de la méthode wc après une documentation des classes et méthodes utilisées dans ce code. 2. Compiler et testez ensuite le code avec plusieurs jeux de tests. Code WordCount import java.io.*; class WordCount { public static int words =0; public static int lines =0; public static int chars =0; public static void wc (InputStream f) throws IOException { int c=0; boolean lastNotWhite = false; String whiteSpace =" \t\n\r"; while ( (c=f.read( )) != -1) { chars ++; if (c== '\n') { lines++; } if ( whiteSpace.indexOf(c) != -1) { if (lastNotWhite) { words++; } lastNotWhite = false; } else { lastNotWhite = true; } } } public static void main (String args[ ]) { InputStream f; try { if (args.length ==0) { f= (System.in); wc(f); } else { for (int i=0;i<args.length; i++) { f= new FileInputStream(args[i]); wc(f); } } } catch( IOException e) { return; } System.out.println(lines + " " + words + " " + chars); } } Solution La méthode wc fonctionne sur n`importe quel flux d`entrée. Sa tâche permet de compter le nombre de caractères, des lignes et des mots. Elle prend en considération les espaces vides. System.in est utilisé si aucun argument n’est fourni. Les arguments qui peuvent être fournis sont considérés comme des noms de fichiers. Une instance de la classe FileInputStream est alors créée pour chaque fichier fourni comme argument. La méthode wc est alors appliquée sur les objets crées. Une amélioration possible : Au lieu de tester si le caractère lu est un espace (ce qui nécessite de nombreux tests) , on cherche à avoir un caractère d`avance dans le flux d`entrée, on pourrait voir alors s`il y a d`autres espaces et mettre le compteur à jour lorsque le prochaine caractère n`est pas un espace. La classe PushBackInputStream peut être utilisée au niveau de la méthode wc (voir : http://java.sun.com/j2se/1.5.0/docs/api/java/io/PushbackInputStream.ht ml). -note : "[ \t\n\r]*" : espace blanc.