[Débutant] objet : contenu et référence vu pas un noob
Hello,
J'essaie de ma mettre à Java, mais c'est pas si simple ... :aie:
Je fais un programme qui va récupérer des informations dans un fichier texte et les met ensuite dans un fichier texte séparé par ";".
J'ai donc une classe FicSortie qui implémente un objet à partir du répertoire et du nom de ficher. Jusque là ça va :P . Maintenant j'ai plusieurs méthodes, et c'est là je pense que je fais pas ce qu'il faut ...
Pour résumer, mon fichier de test initial ne comprenait que 1100 lignes, donc le traitement était assez rapide. J'ai voulu le tester sur un fichier de 34000 lignes :mouarf: et là même après un café ça avait toujours pas finit !! Un script plus complexe en perl s'exécute en quelques secondes sur le même fichier :cry:
Bref, j'ai construit ma classe ainsi:
- constructeur : à partir du répertoire et du nom de fichier
- méthode contenu : lit le fichier ligne à ligne et renvoie un String où chaque ligne est séparée par un ";"
- méthode nbAnalyses : split le résultat de contenu() par ";", et compte le nombre d'occurences d'une chaine de texte ("IDENTIFICATION"), renvoie un Integer
- méthode listeAnalyses : split le résultat de contenu() par ";", et récupère les identifiants concernés, renvoie un Integer[] contenant les identifiants (qui sont donc des entiers)
- contenuAnalyse(identifiant) : split le résultat de contenu() par ";", recherche la partie concernant l'identifiant passé en argument, et renvoie un String[] avec les infos nécessaires
Au début à chaque appel de .contenu() il relisait le fichier texte, plutôt long :oops: , donc j'ai ajouté dans ma classe un booléen qui sert à savoir si le contenu a déjà été récupéré, et si c'est le cas alors contenu() le renvoie mais sans relire le fichier (un String le stocke dans la classe).
Néanmoins j'ai l'impression que j'emmêle les pinceaux dans la manipulation des objets, je pense stocker le résultat de .contenu().split(";") dans un String[], hors à chaque fois que j'utilise ledit String[] il fait appel à ma méthode contenu(), est-ce normal ?
Mon programme principal :
Code:
1 2 3 4 5 6 7 8
| public static void main(String[] args) {
FicSortie fichier = new FicSortie("C:\\MONCHEMIN\\","fichier.txt");
System.out.println("Nombre d'analyses : "+fichier.nbAnalyses());
System.out.println("Analyses n° 3 : "+fichier.listeAnalyses()[2]);
} |
Et ma classe FicSortie :
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 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
| import java.io.BufferedReader;
import java.io.FileReader;
public class FicSortie {
// Variables d'instance
private String monChemin;
private String monFichier;
// Variables globales
private Boolean dejaFait; // pour savoir si le fichier a déjà été récupéré
private String contenuFichier; // contenu du fichier si déjà récupéré
// Constructeur
public FicSortie(String chemin, String fichier) {
monChemin = chemin;
monFichier = fichier;
dejaFait = false;
contenuFichier = null;
}
// les méthodes
// renvoie le nombre d'analyses
public Integer nbAnalyses (){
Integer comptage=0; // pour compter le nombre d'analyses, sert de retour
String[] champsContenu=null; // tableau contenant les lignes de .contenu() splittées par ;
champsContenu=contenu().split(";");
for (int cpt = 0; cpt < champsContenu.length ; cpt++){
if (champsContenu[cpt].equals("IDENTIFICATION")){
comptage++;
} // fin du if
} // fin de la boucle for
return comptage;
}
// renvoie un Integer[] contenant les numéros d'analyses
public Integer[] listeAnalyses () {
String[] champsContenu=contenu().split(";"); // tableau contenant les lignes de .contenu() splittées par ;
String listeConcateneAnalyses = null;
Integer[] listeRetourAnalyses = new Integer[nbAnalyses()];
int cpt2 = 0 ; // intialisation du compteur pour le tableau d'entiers listeRetourAnalyses
for (int cpt = 0; cpt < champsContenu.length ; cpt++){
if (champsContenu[cpt].equals("IDENTIFICATION")){
if (listeConcateneAnalyses == null){
listeRetourAnalyses[cpt2] = Integer.valueOf(champsContenu[cpt+1]);
cpt2++;
listeConcateneAnalyses = champsContenu[cpt+1];
} // fin du if
else {
listeRetourAnalyses[cpt2] = Integer.valueOf(champsContenu[cpt+1]);
cpt2++;
listeConcateneAnalyses = listeConcateneAnalyses+";"+champsContenu[cpt+1];
} // fin du else
} // fin du if
} // fin de la boucle for
champsContenu = listeConcateneAnalyses.split(";");
return listeRetourAnalyses;
}
// renvoie le contenu du fichier
private String contenu (){
BufferedReader lecture=null;
if (dejaFait) {
// TEST
System.out.println("Fichier : déjà ouvert");
return contenuFichier;
}
else {
try{
FileReader fichierAlire = new FileReader(monChemin + monFichier);
// TEST
System.out.println("1ère ouverture du fichier");
lecture = new BufferedReader(fichierAlire);
} catch (Exception e){
Erreur(e,1);
}
}
String ligne=null; // pour stocker le contenu de chaque ligne lue
String ligneConcatene=null; // pour TEST
try{
while((ligne=lecture.readLine())!=null){
if (ligneConcatene == null){
ligneConcatene = ligne;
} // fin du if
else {
ligneConcatene = ligneConcatene+";"+ligne;
} // fin du else
} // fin du while
} catch (Exception e){
Erreur(e,2);
} // fin gestion erreur sur ouverture
// fermeture fichier
try{
lecture.close();
} catch (Exception e){
Erreur(e,3);
} // fin gestion d'erreur sur fermeture
//System.out.println("Fichier "+fichier+" fermé");
contenuFichier = ligneConcatene; // on stocke dans la variable globale le contenu du fichier
dejaFait = true; // on met true pour dire que c'est déjà fait
return ligneConcatene;
}
// Gestion des erreurs
private static void Erreur(Exception e, int code){
System.err.println("Erreur : "+e);
System.exit(code);
}
public static void main(String[] args) {
}
} |
Pour information ça me renvoie :
Citation:
Ceci est un test
On va tester la lecture du fichier de sortie
On vient d'instancier l'objet FicSortie
1ère ouverture du fichier
Nombre d'analyses : 9
Fichier : déjà ouvert
Fichier : déjà ouvert
Analyse numéro 3 : 7400
C'EST FINI !!
Donc, normalement dans ma méthode listeAnalyses(), la ligne String[] champsContenu=contenu().split(";"); fait appel à contenu() et stocke bien des éléments String dans le String[] champsContenu, donc les futures opérations sur champsContenu ne feront pas appel à contenu(), n'est-ce pas ?
Est-ce que je devrais pour contenu() plutôt que renvoyer une chaine texte séparée par des ";" renvoyer un String[] ?
Existe-il une méthode plus rapide pour lire un fichier texte de 34000 lignes ??
Usti