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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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