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.
Exercice
1:
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.* ;
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 ») ;
}
}