III - Classes d'usage courant
III- J-3 - Ecrire un enregistrement
Le programme suivant écrit un article dans un fichier appelé "data" : // classes importées
import java.io.*;
public class test1{
// teste l'écriture d'une structure (au sens du C) dans un fichier binaire // la structure article
private static class article{ // on définit la structure public String code; public String nom; public double prix; public int stockActuel; public int stockMinimum; }//classe article
public static void main(String arg[]){
// on définit le fichier binaire dans lequel seront rangés les articles RandomAccessFile fic=null;
// on définit un article article art=new article(); art.code="a100"; art.nom="velo"; art.prix=1000.80; art.stockActuel=100; art.stockMinimum=10; // on définit le fichier try{
fic=new RandomAccessFile("data","rw"); } catch (Exception E){
erreur("Impossible d'ouvrir le fichier data",1); }//try-catch
// on écrit try{
ecrire(fic,art); } catch (IOException E){
erreur("Erreur lors de l'écriture de l'enregistrement",2); }//try-catch
// c'est fini try{
fic.close(); } catch (Exception E){
erreur("Impossible de fermer le fichier data",2); }//try-catch
}//main
// méthode d'écriture
public static void ecrire(RandomAccessFile fic, article art) throws IOException{ // code
fic.writeBytes(art.code); // le nom limité à 20 caractères art.nom=art.nom.trim();
int l=art.nom.length(); int nbBlancs=20-l; if(nbBlancs>0){ String blancs="";
for(int i=0;i<nbBlancs;i++) blancs+=" "; art.nom+=blancs;
} else art.nom=art.nom.substring(0,20); fic.writeBytes(art.nom);
// le prix
// les stocks
fic.writeInt(art.stockActuel); fic.writeInt(art.stockMinimum); }// fin écrire
// ---erreur
public static void erreur(String msg, int exitCode){ System.err.println(msg);
System.exit(exitCode); }// fin erreur
}// fin class
C'est le programme suivant qui nous permet de vérifier que l'exécution s'est correctement faite.
III-J-4 - Lire un enregistrement
// classes importées
import java.io.*;
public class test2{
// teste l'écriture d'une structure (au sens du C) dans un fichier binaire // la structure article
private static class article{ // on définit la structure public String code; public String nom; public double prix; public int stockActuel; public int stockMinimum; }//classe article
public static void main(String arg[]){
// on définit le fichier binaire dans lequel seront rangés les articles RandomAccessFile fic=null;
// on ouvre le fichier en lecture try{
fic=new RandomAccessFile("data","r"); } catch (Exception E){
erreur("Impossible d'ouvrir le fichier data",1); }//try-catch
// on lit l'article unique du fichier article art=new article();
try{
lire(fic,art); } catch (IOException E){
erreur("Erreur lors de la lecture de l'enregistrement",2); }//try-catch // on affiche l'enregistrement lu affiche(art); // c'est fini try{ fic.close(); } catch (Exception E){
erreur("Impossible de fermer le fichier data",2); }//try-catch
}// fin main
// méthode de lecture
public static void lire(RandomAccessFile fic, article art) throws IOException{ // lecture code
art.code="";
for(int i=0;i<4;i++) art.code+=(char)fic.readByte(); // nom
art.nom="";
art.nom=art.nom.trim(); // prix art.prix=fic.readDouble(); // stocks art.stockActuel=fic.readInt(); art.stockMinimum=fic.readInt(); }// fin écrire // ---affiche
public static void affiche(article art){ System.out.println("code : "+art.code); System.out.println("nom : "+art.nom); System.out.println("prix : "+art.prix);
System.out.println("Stock actuel : "+art.stockActuel); System.out.println("Stock minimum : "+art.stockMinimum); }// fin affiche
// ---erreur
public static void erreur(String msg, int exitCode){ System.err.println(msg);
System.exit(exitCode); }// fin erreur
}// fin class
Les résultats d'exécution sont les suivants : E:\data\serge\JAVA\random>java test2 code : a100 nom : velo prix : 1000.8 Stock actuel : 100 Stock minimum : 10
On récupère bien l'enregistrement qui avait été écrit par le programme d'écriture.
III-J-5 - Conversion texte --> binaire
Le programme suivant est une extension du programme d'écriture d'un enregistrement. On écrit maintenant plusieurs enregistrements dans un fichier binaire appelé data.bin. Les données sont prises dans le fichier data.txt suivant :
E:\data\serge\JAVA\random>more data.txt a100:velo:1000:100:10 b100:pompe:65:6:2 c100:arc:867:10:5 d100:fleches - lot de 6:450:12:8 e100:jouet:10:2:3 // classes importées import java.io.*; import java.util.*;
public class test3{
// fichier texte --> fichier binaire // la structure article
private static class article{ // on définit la structure public String code; public String nom; public double prix; public int stockActuel; public int stockMinimum; }//classe article
public static void main(String arg[]){
RandomAccessFile dataBin=null; try{
dataBin=new RandomAccessFile("data.bin","rw"); } catch (Exception E){
erreur("Impossible d'ouvrir le fichier data.bin",1); }
// les données sont prises dans un fichier texte BufferedReader dataTxt=null;
try{
dataTxt=new BufferedReader(new FileReader("data.txt")); } catch (IOException E){
erreur("Impossible d'ouvrir le fichier data.txt",2); }
// fichier .txt --> fichier .bin String ligne=null;
String[] champs=null; int numLigne=0; String champ=null;
article art=new article(); // article à créer try{
while((ligne=dataTxt.readLine())!=null){ // une ligne de + numLigne++; // décomposition en champs champs=ligne.split(":"); // il faut 5 champs if(champs.length!=5)
erreur("Ligne "+numLigne+" erronée dans data.txt",3); //code
art.code=champs[0]; if(art.code.length()!=4)
erreur("Code erroné en ligne "+numLigne+" du fichier data.txt",12); // nom, prénom
art.nom=champs[1]; // prix
try{
art.prix=Double.parseDouble(champs[2]); } catch (Exception E){
erreur("Prix erroné en ligne "+numLigne+" du fichier data.txt",4); }
// stock actuel try{
art.stockActuel=Integer.parseInt(champs[3]); } catch (Exception E){
erreur("Stock actuel erroné en ligne "+ numLigne + " du fichier data.txt",5); }
// stock actuel try{
art.stockActuel=Integer.parseInt(champs[3]); } catch (Exception E){
erreur("Stock actuel erroné en ligne "+ numLigne + " du fichier data.txt",5); }
// on écrit l'enregistrement try{
ecrire(dataBin,art); } catch (IOException E){
erreur("Erreur lors de l'écriture de l'enregistrement "+numLigne,7); }
// on passe à la ligne suivante }// fin while
} catch (IOException E){
erreur("Erreur lors de la lecture du fichier data.txt après la ligne "+numLigne,8); }
// c'est fini try{
dataBin.close(); } catch (Exception E){
erreur("Impossible de fermer le fichier data.bin",10); }
dataTxt.close(); } catch (Exception E){
erreur("Impossible de fermer le fichier data.txt",11); }
}// fin main
// méthode d'écriture
public static void ecrire(RandomAccessFile fic, article art) throws IOException{ // code
fic.writeBytes(art.code); // le nom limité à 20 caractères art.nom=art.nom.trim();
int l=art.nom.length(); int nbBlancs=20-l; if(nbBlancs>0){ String blancs="";
for(int i=0;i<nbBlancs;i++) blancs+=" "; art.nom+=blancs; } else art.nom=art.nom.substring(0,20); fic.writeBytes(art.nom); // le prix fic.writeDouble(art.prix); // les stocks fic.writeInt(art.stockActuel); fic.writeInt(art.stockMinimum); }// fin écrire // ---erreur
public static void erreur(String msg, int exitCode){ System.err.println(msg);
System.exit(exitCode); }// fin erreur
}// fin class
C'est le programme suivant qui permet de vérifier que celui-ci a correctement fonctionné.
III-J-6 - Conversion binaire --> texte
Le programme suivant lit le contenu du fichier binaire data.bin créé précédemment et met son contenu dans le fichier texte data.text. Si tout va bien, le fichier data.text doit être identique au fichier d'origine data.txt.
// classes importées
import java.io.*;
import java.util.*;
public class test5{
// fichier texte --> fichier binaire // la structure article
private static class article{ // on définit la structure public String code; public String nom; public double prix; public int stockActuel; public int stockMinimum; }//classe article
// main
public static void main(String arg[]){
// on définit le fichier binaire dans lequel seront rangés les articles RandomAccessFile dataBin=null;
try{
dataBin=new RandomAccessFile("data.bin","r"); } catch (Exception E){
erreur("Impossible d'ouvrir le fichier data.bin en lecture",1); }
PrintWriter dataTxt=null; try{
dataTxt=new PrintWriter(new FileWriter("data.text")); } catch (IOException E){
erreur("Impossible d'ouvrir le fichier data.text en écriture",2); }
// fichier .bin --> fichier .text
article art=new article(); // article à créer // on exploite le fichier binaire
int numRecord=0;
long l=0; // taille du fichier try{
l=dataBin.length(); } catch (IOException e){
erreur("Erreur lors du calcul de la longueur du fichier data.bin",2); }
long pos=0; // position courante dans le fichier try{
pos=dataBin.getFilePointer(); } catch (IOException e){
erreur("Erreur lors de la lecture de la position courante dans data.bin",2); }
// tant qu'on n'a pas dépassé la fin du fichier while(pos<l){
// lire enregistrement courant et l'exploiter numRecord++;
try{
lire(dataBin,art); } catch (Exception e){
erreur("Erreur lors de la lecture de l'enregistrement "+numRecord,2); }
affiche(art);
// écriture de la ligne de texte correspondante dans dataTxt
dataTxt.println(art.code.trim()+":"+art.nom.trim()+":"+art.prix+":"+art.stockActuel+":"+art.stockMinimum );
// on continue ? try{
pos=dataBin.getFilePointer(); } catch (IOException e){
erreur("Erreur lors de la lecture de la position courante dans data.bin",2); }
}// fin while // c'est fini try{
dataBin.close(); } catch (Exception E){
erreur("Impossible de fermer le fichier data.bin",2); }
try{
dataTxt.close(); } catch (Exception E){
erreur("Impossible de fermer le fichier data.text",2); }
}// fin main
// méthode de lecture
public static void lire(RandomAccessFile fic, article art) throws IOException{ // lecture code
art.code="";
for(int i=0;i<4;i++) art.code+=(char)fic.readByte(); // nom
art.nom="";
for(int i=0;i<20;i++) art.nom+=(char)fic.readByte(); art.nom=art.nom.trim(); // prix art.prix=fic.readDouble(); // stocks art.stockActuel=fic.readInt(); art.stockMinimum=fic.readInt(); }// fin écrire
// ---affiche
public static void affiche(article art){ System.out.println("code : "+art.code); System.out.println("nom : "+art.nom); System.out.println("prix : "+art.prix);
System.out.println("Stock actuel : "+art.stockActuel); System.out.println("Stock minimum : "+art.stockMinimum); }// fin affiche
// ---erreur
public static void erreur(String msg, int exitCode){ System.err.println(msg);
System.exit(exitCode); }// fin erreur
}// fin class
Voici un exemple d'exécution :
E:\data\serge\JAVA\random>java test5 code : a100 nom : velo prix : 1000.0 Stock actuel : 100 Stock minimum : 0 code : b100 nom : pompe prix : 65.0 Stock actuel : 6 Stock minimum : 0 code : c100 nom : arc prix : 867.0 Stock actuel : 10 Stock minimum : 0 code : d100
nom : fleches - lot de 6 prix : 450.0 Stock actuel : 12 Stock minimum : 0 code : e100 nom : jouet prix : 10.0 Stock actuel : 2 Stock minimum : 0 E:\data\serge\JAVA\random>more data.text a100:velo:1000.0:100:0 b100:pompe:65.0:6:0 c100:arc:867.0:10:0 d100:fleches - lot de 6:450.0:12:0 e100:jouet:10.0:2:0