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 ».

 

Correction de l’exercice 1

 

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

                  }