Ecriture dans un fichier impossible
Résolu
Robin
-
Hacker_Vaillant Messages postés 1 Date d'inscription Statut Membre Dernière intervention -
Hacker_Vaillant Messages postés 1 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
A cette heure ci tout le monde doit être couché .. mais bon, je tente quand même de vous exposer mon problème.
Je souhaite écrire l'arborescence (Fichiers + Sous-repertoire) dans un fichier.txt.
Mon programme fonctionne partiellement, l'arborescence s'écrit dans la console, mais pas dans le fichier, je ne comprend pas pourquoi ..
Tentez de compiler ce code, vous vous rendrez vite compte du problème.
Je débute en java alors ne m'en voulez pas trop ..
Merci d'avance :)
A cette heure ci tout le monde doit être couché .. mais bon, je tente quand même de vous exposer mon problème.
Je souhaite écrire l'arborescence (Fichiers + Sous-repertoire) dans un fichier.txt.
Mon programme fonctionne partiellement, l'arborescence s'écrit dans la console, mais pas dans le fichier, je ne comprend pas pourquoi ..
Tentez de compiler ce code, vous vous rendrez vite compte du problème.
public class ListerMusiques { private static void ListerEtEcrire (File file, int level) throws IOException { //Création du fichier texte qui va contenir l'arborescence du repertoire FileWriter writer = new FileWriter("C:\\ListeMusiques.txt"); for (File f : file.listFiles()) { for (int i = 0; i < level; i++) { System.out.print (" "); writer.write(" "); } if (f.isDirectory()) { System.out.println ("" + f.getName() + "\r\n"); writer.write ("" + f.getName() + "\r\n"); ListerEtEcrire (f, level + 1); } else { System.out.println (" " + f.getName() + "\r\n"); writer.write (" " + f.getName() + "\r\n"); } } writer.close(); } public static void main (String[] args) throws IOException { //Repertoire a explorer File file = new File ("C:\\Musiques"); ListerEtEcrire (file, 0); } }
Je débute en java alors ne m'en voulez pas trop ..
Merci d'avance :)
A voir également:
- Ecriture dans un fichier impossible
- Fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier rar - Guide
- Impossible de supprimer un fichier - Guide
2 réponses
Le problème c'est que tu appelles récursivement ta méthode qui ouvre toujours le même fichier "C:\\ListeMusiques.txt".
Donc quand tu arrives au level+1, ton fichier est déjà ouvert au level+0, ce qui pose bien sûr quelques problèmes d'accès en écriture.
Il faudrait toujours donc garder le même flux ouvert.
Il y a aussi d'autres détails qui sont pas terribles dans ton code, comme ta boucle sur les level, alors qu'il suffirait d'accumuler des caractères sur une String, ainsi que la répétition inutile des mêmes opérations dans ton if et dans ton else :
Remarque : "write" force l'écriture, ce qui est une perte de temps en comparaison de "append" qui ajoute les données à une liste qui attendra qu'il y ait suffisamment de données pour écrire (dans tous les cas le "close" assure que tout est écrit à la fin).
La confiance n'exclut pas le contrôle
Donc quand tu arrives au level+1, ton fichier est déjà ouvert au level+0, ce qui pose bien sûr quelques problèmes d'accès en écriture.
Il faudrait toujours donc garder le même flux ouvert.
Il y a aussi d'autres détails qui sont pas terribles dans ton code, comme ta boucle sur les level, alors qu'il suffirait d'accumuler des caractères sur une String, ainsi que la répétition inutile des mêmes opérations dans ton if et dans ton else :
private static final String alinea = " "; private static final String endl = System.lineSeparator(); public static void listerEtEcrire(String dossierALister, String nomDuFichierResultat) throws IOException { FileWriter writer = new FileWriter(nomDuFichierResultat); listerEtEcrire(new File(dossierALister),"",writer); writer.close(); } private static void listerEtEcrire(File path, String level, FileWriter writer) throws IOException { for (File f : path.listFiles()) { System.out.println(level+f.getName()); writer.append(level).append(f.getName()).append(endl); if (f.isDirectory()) listerEtEcrire(f,level+alinea,writer); } } public static void main (String[] args) throws IOException { listerEtEcrire("C:\\Musiques","C:\\ListeMusiques.txt"); }
Remarque : "write" force l'écriture, ce qui est une perte de temps en comparaison de "append" qui ajoute les données à une liste qui attendra qu'il y ait suffisamment de données pour écrire (dans tous les cas le "close" assure que tout est écrit à la fin).
La confiance n'exclut pas le contrôle
Merci pour ta réponse, j'ai réussi à régler mon problème, le problème est résolu.
J'ai instancier mon FileWriter dans ma méthode main et je le passe en paramètres de ma méthode ListerEtEcrire, sans oublier le close dans ma méthode main.
Je met le code complet (sait-on jamais, si quelqu'un a le même problème que moi ... ) :
Merci pour ton aide.
Bonne soirée ;)
J'ai instancier mon FileWriter dans ma méthode main et je le passe en paramètres de ma méthode ListerEtEcrire, sans oublier le close dans ma méthode main.
Je met le code complet (sait-on jamais, si quelqu'un a le même problème que moi ... ) :
public class ListerMusiques { private static void ListerEtEcrire (File file, int level, FileWriter writer) throws IOException { for (File f : file.listFiles()) { for (int i = 0; i < level; i++) { System.out.print ("\t"); writer.write("\t"); } if (f.isDirectory()) { System.out.println ("" + f.getName()); writer.write ("" + f.getName() + "\r\n"); ListerEtEcrire (f, level + 1, writer); } else { System.out.println ("\t" + f.getName()); writer.write ("\t" + f.getName() + "\r\n"); } } } public static void main (String[] args) throws IOException { FileWriter writer = new FileWriter("C:\\ListeMusiques.txt"); System.out.println ("MES MUSIQUES"); System.out.println ("--------------------------------------------\r\n"); writer.write ("MES MUSIQUES"); writer.write ("--------------------------------------------\r\n"); //Repertoire a explorer File file = new File ("C:\\Musiques"); ListerEtEcrire (file, 0, writer); writer.close(); } }
Merci pour ton aide.
Bonne soirée ;)