Vous êtes sur la page 1sur 5

Noter et modifier des scores

On s'interesse noter dans un fichier une suite de scores sous la forme d'un suite de lignes ; chaque ligne contient un nom et un entier ; l'entier reprsente un score obtenu par la personne dont le nom est indiqu. On aura par exemple :
irene 12 olivier 8 david 19

Il s'agit de raliser un programme qui permette de prendre partir de l'entre standard des lignes constitues d'un nom et d'un score pour actualiser le fichier.

Si le nom n'existait pas, une nouvelle ligne est cre pour mettre ce nouveau nom et son score. Si le nom existait dj, le score est actualis.

Dans une mme excution du programme, l'utilisateur pourra entrer successivement plusieurs lignes comportant chacune nom et score. Il terminera en retournant une ligne blanche. Aprs chaque ajout ou modification de score, le fichier sera actualis et son contenu sera affich. L'utilisateur indiquera sur la ligne de commande le nom du fichier utilis. Si le fichier n'existait pas, il sera alors cr. On conseille de crer une classe, nomme par exemple Joueur contenant deux attributs : un pour un nom (chane de caractres), un pour un score(entier) et d'crire dans le fichier directement les instances de Joueur, comme desObject(s) ; bien entendu, on lira alors dans le fichier des Object(s). Dans ce cas, on ne pourra pas lire le fichier directement, visuellement, en l'ouvrant.
CORRIGE : import java.io.*; import java.util.*;

class Joueur implements Serializable{ int score; String nom;

Joueur(String nomEtScore) { // nomEtScore contient le nom, des espaces et le score StringTokenizer st = new StringTokenizer(nomEtScore);

try { nom = st.nextToken(); score = Integer.parseInt(st.nextToken()); } catch(Exception exc) { System.out.println("ligne non conforme"); } }

Joueur(String nom, int score) { this.nom = nom; this.score = score; } }

class Enregistreur { File fichier;

Enregistreur(String nomFichier) { fichier = new File(nomFichier); }

void ecrire(Joueur nouveau) throws Exception { Joueur nj; ObjectInputStream entree = null; ObjectOutputStream sortie = null; boolean trouve = false; File temporaire = new File("temp.txt");

sortie = new ObjectOutputStream(new FileOutputStream(temporaire)); try { entree = new ObjectInputStream (new FileInputStream(fichier)); nj=(Joueur) entree.readObject(); while (true) { if (nouveau.nom.equals(nj.nom)) { sortie.writeObject(nouveau); trouve = true; }

else sortie.writeObject(nj); nj=(Joueur)entree.readObject(); } } catch(FileNotFoundException exc) {} catch (EOFException exc) { entree.close(); } if (!trouve) sortie.writeObject(nouveau);

sortie.close(); fichier.delete(); temporaire.renameTo(fichier); }

void lire() throws Exception { int a; Joueur nj; ObjectInputStream entree= new ObjectInputStream(new FileInputStream(fichier)); System.out.println("contenu du fichier"); try { nj=(Joueur)entree.readObject(); while (nj != null) { System.out.println("noms : " + nj.nom + ", score : " + nj.score); nj=(Joueur)entree.readObject();

} } catch (EOFException exc) { entree.close(); } System.out.println(); }

public static void main(String[] arg) throws Exception { Enregistreur enregistreur = new Enregistreur(arg[0]); BufferedReader entree = new BufferedReader (new InputStreamReader(System.in)); String ligne;

ligne = entree.readLine(); while(ligne.length() != 0) { enregistreur.ecrire(new Joueur(ligne)); enregistreur.lire(); ligne = entree.readLine(); } } }