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:
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 // // 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
Les soucis:
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; } }
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.
- 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
Merci de m'éclairer un peu![]()
Partager