• Aucun résultat trouvé

J-3 - Ecrire un enregistrement

Dans le document Télécharger cours Java en pdf (Page 95-101)

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

Dans le document Télécharger cours Java en pdf (Page 95-101)