C.
RECANATI
IHM Java
Swing
DESS EID
2004/2005
TP n¡ 3
Rappels sur les flots d’entrée et les flots d’objets :
Ø
Les opérations de
flots d’entrée d’octets sont définies par des
sous-classes de la classe abstraite InputStream, et
celles sur les flots d’entrée de caractères par les
sous-classes de Reader
Ø
Les classes de flots
d’entrée filtrés complètent les classes de flots de
sortie filtrés
Ø
La classe System de java.lang définit les membres in, out et err (de type PrintStream) pour représenter respectivement le flot
d’entrée standard et les flots de sortie standard et
d’erreur standard
Ø
La classe RandomAccessFile permet de
lire et d’écrire dans un fichier
Ø
On peut utiliser la
classe StreamTokenizer
pour lire des données
formatées à partir d’un flot
En
outre :
Ø
La sérialisation
d’objets est prise en charge via les classes ObjectOutputStream
et ObjectInputStream
Ø
Les objets sont
écrits dans un fichier en appelant la méthode writeObject() de l’objet ObjectOutputStream
correspondant au fichier
Ø
Les objets sont lus dans
un fichier en appelant la méthode readObject() de
l’objet ObjectInputStream correspondant au fichier
Exercice
1 : lecture
à partir du fichier premiers.bin
1) Créez un programme
permettant de lire un fichier de nombres premiers tel qu’il aurait
été créé dans l’exercice 3 du TP
précédent.
2) Affichez à
l’écran ces données à l’aide d’un flot
de caractères.
F Pour la
question 1) le principe est analogue à ce qui a été fait
pour écrire les données binaires dans un flot de sortie : il
faut créer un objet DataInputStream à partir
d’un FileInputStream.
Pour la question 2) utiliser
un objet FormatWriter qui gère l’affichage à
l’écran.
Exercice
2: (variante) lecture à partir du
fichier compressé.
F on
créera un ZipInputStream (intitulé monFichierZip) à partir du FileInputStream
et un ZipEntry à partir de monFichierZip en faisant appel à getNextEntry().
Ensuite on
crée un DataInputStream bufferizé à partir de monFichierZip . Le reste est inchangé.
Exercice 3: Ecrire une
classe publique SimpleThread qui étend Thread et
possède un constructeur prenant en entrée une chaîne et
appelant le constructeur équivalent de sa superclasse. Sa méthode
run est redéfinie par
public void run()
{
for
(int i = 0; i < 10; i++) {
System.out.println(i + " " + getName());
try {
sleep((long)(Math.random() * 1000));
} catch (InterruptedException e) {}
}
System.out.println("TERMINE! " +
getName());
}
1) Tester cette classe avec
le main d’une classe TesteDeuxThread qui
lance deux SimpleThread
nommés
« Jamaïque » et « Bora
Bora », puis celui de la classe TesteTroisThread qui en lance un de plus nommé
« Tahiti ».
question
1) :
import
java.io.* ;
public
class LirePremiers {
public
static void main (String [ ] args ) {
try
{
String nomDuRepertoire =
« ../DonneesInutilisables » ;
String nomFichier =
« premiers.bin » ;
File mesNbPremiers = new File
(nomDuRepertoire,
nomFichier) ;
DataInputStream
premiersInt
=
new DataInputStream (
new
FileInputStream (
mesNbPremiers))) ;
//
Ici, le code permettant de lire les nombres
//
les nombres premiers dans le flot précédant
//
et de les afficher à l’écran (question
2)
out.close() ;
premiersInt.close() ;
}
catch
(FileNotFoundException e) {
System.err.println(e);
return ;
}
catch
(IOException e) { // Exception
de lecture de fichier
System.err.println(« Erreur
lecture fichier d’entrée
»
+
e);
return ;
}
}
}
question
2) :
//
Créer un flot de sortie de caractères formaté par
défaut
FormatWriter
out = new FormatWriter (
new
BufferedWriter (
new
FileWriter (FileDescriptor.out))) ;
long
[ ] Premiers = new long [6] ; // tableau d’une ligne
boolean
EOF = false ; //
indicateur de fin de fichier
while
( !EOF) {
int
index = 0 ;// index pour stocker les nombres
premiers
try
{
//
remplir la ligne avec les nbs venant du fichier
for
(index = 0 ; index < Premiers.length ;
index++)
Premiers
[index] = premiersInt.readLong() ;
}
catch
(EOFException e) {
EOF
= true ;
//
mettra fin à la boucle
}
//
Afficher les nombres premiers qui sont
//
dans le tableau Premiers sur une ligne de sortie
for
(int j = 0 ; j < index ; j++)
out.print(Premiers[j]) ;
out.println() ;
//
passer à la ligne suivante
}