Solution

publicité
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.
Téléchargement