C. RECANATI

IHM Java Swing

DESS EID 2004/2005

 

 

 

 

TP n¡ 2

 

Rappels sur les sorties des types élémentaires de données vers un flot :

Ø    Un chemin d’accès à un fichier peut être représenté par un objet de la classe File et un fichier physique peut être représenté par un objet du type FileDescriptor

Ø    Les opérations sur les flots d’octets génèrent des flots contenant des octets (sans conversion) et les opérations sur les flots de caractères génèrent des flots qui contiennent des caractères dans le code de caractères de la machine locale

Ø    Les flots de sortie d’octets sont représentés par des sous-classes de la classe abstraite OutputStream.  Ces classes permettent d’écrire vers un fichier

Ø    Les flots de sortie de caractères sont représentés par des sous-classes de la classe abstraite Writer

En outre :

Ø    Les classes de flot de sorties filtré peuvent être utilisées pour améliorer les fonctionnalités des classes de flot de sortie de base qui représentent un fichier physique

Ø    Si vous souhaitez formater les données que vous écrivez dans un flot, vous devez mettre en œuvre vous-même une fonction de formatage

 

 

Exercice 1: Sorties binaires : la classe FileOutputStream.

Ecrire un programme qui crée un objet File à partir d’un chemin d’accès après avoir vérifié que ce fichier existe, ou qui crée un objet File et un nouveau fichier, si ce dernier n’existait pas.

F  Utiliser exists() et createNewFile() et traiter les IOException  par une impression sur la sortie standard.

 

Exercice 2: Sorties binaires : la classe DataOutputStream.

Ecrire une classe TestFlotDeDonnees qui crée un répertoire à partir d’un chemin (String) s’il n’existe pas, quitte le programme si ce chemin correspond à un fichier qui n’est pas un répertoire, et sinon crée un fichier nommé « donnees.txt » dans ce répertoire (si ce fichier n’existe pas déjà) et va écrire dans ce fichier la chaîne « Donnees inutilisables  entrantes et sortantes ». Le programme traite les exceptions de type IOException  et les imprime  si elles se produisent. On imprimera également la taille en octets du flot DataOutputStream représentant le fichier grâce à la méthode size() [On constate que si la chaîne initiale contient n caractères, ces caractères étant des caractères Unicode (16 bits) ils occupent 2n octets].

 

F  1. Pour créer un DataOutputStream  permettant d’écrire dans un fichier, on crée d’abord un objet File, puis un objet FileOutputStream  à partir de l’objet File, puis un objet DataOutputStream  à partir du FileOutputStream .

2. Pour écrire une String dans le flot de sortie, on dispose de la méthode writeChars() qui accepte un argument de type String.

 

Exercice 3: Sorties mises en tampon (« bufferisées ») vers un fichier.

1) Ecrire un programme qui calcule les 200 premiers nombres premiers et les stocke dans un tableau.

2) Ecrire ensuite les nombres trouvés dans le fichier intitulé « premiers.bin » du répertoire « DonnesUtilisables », en faisant les tests nécessaires pour vérifier que ce nom correspond bien à un nom de répertoire, et/ou créer ce répertoire s’il n’existe pas.

3) Créer un flot de sortie des données mises en tampon pour le fichier « premiers.bin », et écrire ces nombres premiers dans ce fichier à l’aide de la méthode writeLong(). Fermer ensuite le flot et en imprimer la taille. Le résultat obtenu vous semble-t-il raisonnable ? (rappel : vous devez avoir écrit 200 valeurs de type long de 8 octets chacune).

 

Exercice 4 : (variante, si vous avez le temps …)

A partir de l’exercice précédent, écrire un fichier compressé (format ZIP) dans le même répertoire, contenant les mêmes sorties (nombres premiers) compressées.

F  on crée un flot de sortie Zip (ZipOutputStream  au lieu d’un dataOutputStream) ;  on crée une entrée zip pour le fichier (objet de type ZipEntry) et on écrit dans le flot de sortie zip avec putNextEntry() :

         ZipEntry monEntreeZip = new ZipEntry(nomFichier) ;

         monFichierZip.putNextEntry(monEntreeZip) ;

Créer ensuite le flot de sortie vers le flot de sortie zip et écrire le tableau d’entiers dedans.

 

Correction

Exercice 1:

String filename = « monFichier.txt » ;

File unFichier = new File(nomFichier) ;

try {

            if ( !unFichier.exists () ) {

                        // Ouvrir pour l’écraser

                        FileOutputStream file1 = new(FileOutputStream(unFichier)) ;

                        System.out.println (« Flot de sortie monFichier.txt créé ») ;

            }

            else

                        System.out.println (« monFichier.txt existe déjà ») ;

}

catch (IOException e) {

            System.out.println(e) ;

}

 

Exercice 2:

import java.io.* ;

import java.util.Date;

 

public class TestFlotDeDonnees {

         public static void main (String [ ] args ) {

                  String maChaine = new String (« Donnees inutilisables \

entrantes et sortantes ») ;

                  String nomRepertoire = «  xxx/MesDonnees » ;

                  try {

                           File rep = new File (nomRepertoire) ; // Objet File (rep)

                           if ( !rep.exists())     // si le repertoire n’existe pas

                                    rep.mkdir() ; // le créer

                           else if ( !rep.isDirectory()) {

                                    System.err.println (nomRepertoire +

                                                     « n’est pas un repertoire ») ;

                                    return ;

                           }

                           File unFichier = new File(rep, « donnees.txt ») ;

                           unFichier.createNewFile() ; // créer si nécessaire

 

                           DataOutputStream monFlotDeDonnees =

                                    new DataOutputStream (

                                            new FileOutputStream(unFichier)) ;

                           monFlotDeDonnees.writeChars(maChaine) ;

                  }

                  catch (IOException e) {

                           System.out.println (« IOException levee : » + e) ;

                  }

         }

}

 

Exercice 3 :

import java.io.* ;

import java.util.zip.* ;

 

public class TestDeSortieDeNombresPremiers {

         public static void main (String [ ] args ) {

                  long [ ] premiers = new long[200] ;

                  premiers[0] = 2 ;

                  premiers[1] = 3 ;

                  int compteur = 2 ; // nb premiers trouvés jusqu’à présent

 

                  long nombre = 5 ; // l’entier suivant à tester

exterieur :             for ( ; compteur < premiers.length ; nombre += 2L) {

                           // le div. max à tester est la racine carrée du nombre

                           long limite = (long)Math.ceil

                                                     (Math.sqrt((double) nombre)) ;

                           for (int i=1 ; i<count && premiers[i] <= limite ; i++)

                                    if (nombre%premiers[i] == 0) // diviseur ?

                                            continue exterieur ; // oui, essayer suivant

                           premiers [compteur++] = nombre ; // en voilà un !

                  }

                  // écrire les nombres premiers dans un fichier

                  try {

                     String nomDuRepertoire = « ../DonneesUtilisables » ;

                     String nomFichier = « premiers.bin » ; // nom du fichier

 

                     File monRepNbPremiers = new File (nomDuRepertoire) ;

                     if ( !monRepNbPremiers.exists()) // s’il le rep n’existe pas

                           monRepNbPremiers.mkdir() ; // le créer

                     else

                           if ( !monRepNbPremiers.isDirectory()) {

                                    System.out.println(nomDuRepertoire + « n’est \

pas un répertoire ») ;

                                    return ;

                           }

                     // créer l’objet File

                     File fichierNbPremiers = new File (monRepNbPremiers,

                                                                       nomFichier) ;

                     fichierNbPremiers.createNewFile() ; // s’il n’existe pas,

                                                                       // le créer

 

                     // créer un flot de sortie des données mis en tampon pour

                     // le fichier

                     DataOutputStream premiersStream

                                    = new DataOutputStream (

                                            new BufferedOutputStream (

                                            new FileOutputStream

                                                              (fichierNbPremiers))) ;

 

                     // écrire les nb premiers dans le fichier

                     for (int i=0 ; i<premiers.length ; i++)

                           premiersStream.writeLong(premiers[i]) ;

 

                     premiersStream.close() ;// vider et fermer le fichier

                     System.out.println(« Taille du fichier = »

                                                     + premiersStream.size()) ;

                  }

                  catch (IOException e)

                           System.out.println(« IOException  » + e

                                                              + «  est survenue ») ;

         }

}

 

Exercice 4 :

import java.io.* ;

import java.util.zip.* ;

 

public class TestDeSortieDeNombresPremiersZip {

         public static void main (String [ ] args ) {

                  long [ ] premiers = new long[200] ;

                  premiers[0] = 2 ;

                  premiers[1] = 3 ;

                  int compteur = 2 ; // nb premiers trouvés jusqu’à présent

 

                  long nombre = 5 ; // l’entier suivant à tester

exterieur :    for ( ; compteur < premiers.length ; nombre += 2L) {

                           long limite = (long)Math.ceil

                                                     (Math.sqrt((double) nombre)) ;

                           for (int i=1 ; i<count && premiers[i] <= limite ; i++)

                                    if (nombre%premiers[i] == 0) // diviseur ?

                                            continue exterieur ; // oui, essayer suivant

                           premiers [compteur++] = nombre ; // en voilà un !

                  }

 

                  try {

                     String nomDuRepertoire = « ../DonneesInutilisables » ;

                     String nomDuZip = « premiers.zip » ; // l’archive

                     String nomFichier = « premiers.bin » ; // fichier compressé

 

                     File monRepNbPremiers = new File (nomDuRepertoire) ;

                     if ( !monRepNbPremiers.exists())

                           monRepNbPremiers.mkdir() ;

                     else

                           if ( !monRepNbPremiers.isDirectory()) {

                                    System.out.println(nomDuRepertoire + « n’est \

pas un répertoire ») ;

                                    return ;

                           }

                     // créer l’objet File

                     File monZipNbPremiers = new File (monRepNbPremiers,

                                                                       nomDuZip) ;

                     monZipNbPremiers.createNewFile() ; // s’il n’existe pas,

                                                                       // le créer

                     // créer le flot de sortie zip

                     ZipOutputStream monFichierZip

                                    = new ZipOutputStream (

                                                     new FileOutputStream (

                                                              monZipNbPremiers))) ;

 

                     // créer l’entrée zip pour le fichier et l’écrire dans le flot

                     // de sortie zip

                     ZipEntry monEntreeZip = new ZipEntry (nomFichier) ;

                     monFichierZip.putNextEntry(monEntreeZip) ;

 

                     // créer le flot de sortie vers le flot de sortie zip

                     DataOutputStream monFichier

                                    = new DataOutputStream (

                                            new BufferedOutputStream

                                                              (monFichierZip)) ;

                     // écrire les nb premiers dans le fichier

                     for (int i=0 ; i<premiers.length ; i++)

                           monFichier.writeLong(premiers[i]) ;

                     monFichier.flush() ;      // s’assurer que tout est écrit

                     monFichierZip.closeEntry() ; //terminer l’entrée zip

                     monFichier.close() ;      // fermer le flot de fichier

                     System.out.println(« Taille du fichier = »

                                                     + monFichier.size()) ;

                     System.out.println(« Taille du fichier compressé = »

                                    + monEntreeZip.getCompressedSize()) ;

                  }

                  catch (IOException e)

                           System.out.println(« IOException  » + e

                                                              + «  est survenue ») ;

         }

}