Salut,

Envoyé par
Axwell
si vous avez une idée, car pour un assez gros fichier, le process tourne dans le vide. C'est surement la taille du Buffer.
Tout dans problème vient de cette ligne :
Dump.setText(Dump.getText()+ligne+"\n");
A chaque itération du recrée une nouvelle chaine un peu plus grande, ce qui fait que tu alloues une quantité énorme de mémoire temporaire. Par exemple si tu lis un fichier contenant 1000 ligne de 80 caractères (soit 80 Ko), tu alloueras en fait bien plus puisque tu auras crées une chaine de 80, puis une de 160, puis une de 240... jusqu'à arrivé aux 80000 caractères contenant tout ton fichier...
Et en réalité si tu additionnes tout cela tu obtiendras plus de 39 Mo de chaines temporaires... tout cela pour lire un fichier de 80 Ko
(et je ne t'explique même pas si le fichier est plus grand ce que cela peut donner).
Pour pallier à cela il faut copier le fichier dans un StringBuffer (ou StringBuilder à partir de Java 5.0), ce qui va te permettre de mieux gérer la mémoire...
Sinon j'ai d'autre remarque sur ton code :
- Tu peux englober les Reader les uns dans les autres, et éviter ainsi de te trainer plusieurs référence inutilement...
- Utilise plutôt System.getProperty("line.separator") que "\n" car les fins de ligne peuvent être différentes d'un système à l'autre...
- Respecte les conventions de nommage : pas de majuscule en début de nom de variable/attributs (Dump
dump).
Exemple :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| BufferedReader tampon = null;
try {
tampon = new BufferedReader(new FileReader(chemin));
StringBuffer buffer = new StringBuffer();
// Fin de ligne spécifique du système
String endl = System.getProperty("line.separator");
String ligne = null;
while ((ligne=tampon.readLine())!=null) {
buffer.append(ligne).append(endl);
}
Dump.setText(buffer.toString());
} catch (IOException exception) {
exception.printStackTrace();
} finally {
try {
tampon.close();
} catch(IOException exception1) {
exception1.printStackTrace();
}
} |
Tu pourrais également optimiser un peu le StringBuffer/StringBuilder en l'initialisant avec la taille du fichier (ce qui évites qu'il se redimensionnent automatiquement), mais la différence n'est pas forcément flagrante 
Sinon perso je préfère gérer moi même le buffer en faisant une lecture par bloc, et utiliser un try/finally à l'intérieur du try/catch, mais après c'est une question de "goût" :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| try {
Reader reader = new FileReader(chemin);
try {
StringBuffer buffer = new StringBuffer();
char[] cbuf = new char[8192];
int len;
while ((len=reader.read(cbuf))>0) {
buffer.append(cbuf, 0, len);
}
Dump.setText(buffer.toString());
} finally {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
} |
a++
PS : Bon en prévisualisant je vois que j'ai été grillé... j'parle trop
Partager