Lecture dans un fichier texte
Bonjour,
Je voudrais écrire une méthode qui soit capable de lire des informations dans un fichier texte. Les informations sont des jeux de coordonnées (4 int) précédés d'une étiquette (String). On ne sait pas à l'avance combien il y a de jeux de coordonnée. Après exécution de la méthode, les données doivent être stockées dans une HashMap<String, Rectangle>, la clé étant l'étiquette et la structure Rectangle comprenant les 4 données.
En cas d'erreur de lecture, peut importe, on garde les clées enregistrées et on arrête le traitement.
Voila un exemple de fichier actuel valide:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| //
// monFichier.pos
// Coordonnées...
//
// -----------------
// Mes premières coordonnées
// -----------------
imgLogo
90 0 600 90
btnDebuter
290 320 200 30
btnQuitter
290 360 200 30
// -----------------
// Mes secondes coordonnées
// -----------------
btnRetour
290 480 200 30
labTitreTP0
190 200 400 30
btnTP0
290 230 200 30
labTitreTP1
190 280 400 30
btnTP1
290 310 200 30 |
J'ai écrit la méthode qui fonctionne avec ce fichier. Le problème c'est qu'elle est trop stricte, je vous la présente (si vous voyez déjà comment coder la méthode, vous pouvez passer !):
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| public class MaClasse {
private static HashMap<String, Rectangle> hm = new HashMap<String, Rectangle>();
...
private static boolean chargerFichier(String filePath) {
String ligne;
int ligneCount = 1;
try {
// On ouvre le fichier en lecture
FileReader fr = new FileReader(filePath);
BufferedReader br = new BufferedReader(fr);
String cleComposant = "";
Rectangle rect = new Rectangle();
do {
// Lecture d'une ligne
ligne = br.readLine();
if(ligne != null && (ligne.length() >= 2 && !ligne.substring(0,2).equals("//"))) {
if( cleComposant.equals("") ) {
// On lit d'abords le nom du composant
cleComposant = ligne;
} else {
// Ensuite on lit les coordonnées
StringTokenizer tok = new StringTokenizer(ligne, "\t");
if(tok.countTokens() != 4)
throw new StreamCorruptedException("Probleme de structure de fichier.");
// On les place dans le rectangle
rect.setLocation(Integer.parseInt( tok.nextToken() ), Integer.parseInt( tok.nextToken() ));
rect.setSize(Integer.parseInt( tok.nextToken() ), Integer.parseInt( tok.nextToken() ));
// On ajoute à la table
String cle = cleFenetre + "_" + cleComposant;
hm.put(cle, new Rectangle(rect));
// On attends la lecture d'un nouveau composant
cleComposant = "";
}
}
ligneCount++;
} while(ligne != null); // On s'arrête en fin de fichier
}
catch(FileNotFoundException ex) {
System.out.println("Aucun fichier de coordonnees pour " + cleFenetre);
return false;
}
catch(StreamCorruptedException ex) {
System.out.println("Probleme de structure du fichier de coordonnees pour \"" + filePath + "\" ligne " + ligneCount);
return false;
}
catch(NumberFormatException ex) {
System.out.println("Probleme de structure du fichier de coordonnees pour \"" + filePath + "\" ligne " + ligneCount);
return false;
}
catch(IOException ex) {
System.out.println("Probleme lors de la lecture du fichier de coordonnees pour \"" + cleFenetre + "\"");
return false;
}
// Chargement effectué avec succès !
return true;
}
} |
Les soucis:
- Les commentaires doivent être placé en tout début de ligne (ça à la rigueur ce n'est pas grave)
- Les coordonnées doivent être écrite sur une même ligne et séparée par une et une seule tabulation (et pas d'espace)
- Une tabulation en fin ou début de ligne de coordonnée => le fichier est invalide
Voila je voudrais l'améliorer pour plus de souplesse. Je voudrais que l'on puisse écrire librement une étiquette (String), et que après on puisse ajouter autant de séparateur ('\n', '\t' ou ' ') que l'on veut, pour séparer l'étiquette des coordonnées et les coordonnées entre elle.
Merci de m'éclairer un peu :aie: