Ecriture dans un fichier impossible

Résolu/Fermé
Signaler
-
Messages postés
1
Date d'inscription
dimanche 11 novembre 2012
Statut
Membre
Dernière intervention
11 novembre 2012
-
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.



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 :)

2 réponses

Messages postés
16436
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
26 novembre 2021
2 916
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 :

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
Messages postés
1
Date d'inscription
dimanche 11 novembre 2012
Statut
Membre
Dernière intervention
11 novembre 2012

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 ... ) :

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 ;)