IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Parser arborescence fichier


Sujet :

Entrée/Sortie Java

  1. #1
    Membre régulier Avatar de rgomes
    Homme Profil pro
    IT Developer JAVA Senior
    Inscrit en
    Juin 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : IT Developer JAVA Senior
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 128
    Points : 76
    Points
    76
    Par défaut Parser arborescence fichier
    Hello,

    Comment récupérer l'ensemble des fichiers d'un certain type (par exemple des fichiers dont l'extension est .xml) dans l'ensemble des sous répertoires d'un répertoire donné ?
    Si vous avez une solution optimisé, car je suis soumis a une contrainte de perf ^^

    Solution en cours mais moyenne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public static void listeRepertoire ( File dir ) {
        System.out.println ( dir.getAbsolutePath());
        if(dir.endsWith(".xml"))
          process();
     
        if ( dir.isDirectory ( ) ) {
                File[] list = dir.listFiles();
                for ( int i = 0; i < list.length; i++) {
                        // Appel récursif sur les sous-répertoires
                        listeRepertoire( list[i]);
                        if(i==5) break;
                } 
        } 
     }

    Merci pour votre aide.

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut Re: Parser arborescence fichier
    Citation Envoyé par rgomes
    Hello,

    Comment récupérer l'ensemble des fichiers d'un certain type (par exemple des fichiers dont l'extension est .xml) dans l'ensemble des sous répertoires d'un répertoire donné ?
    Si vous avez une solution optimisé, car je suis soumis a une contrainte de perf ^^

    Merci pour votre aide.

    Solution en cours mais moyenne :

    public static void listeRepertoire ( File dir ) {
    System.out.println ( dir.getAbsolutePath());
    if(dir.endsWith(".xml"))
    process();

    if ( dir.isDirectory ( ) ) {
    File[] list = dir.listFiles();
    for ( int i = 0; i < list.length; i++) {
    // Appel récursif sur les sous-répertoires
    listeRepertoire( list[i]);
    if(i==5) break;
    }
    }
    }



    Je ne sais pas si au niveau perf c'est mieux mais bon :
    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
    public static void listeRepertoire(File dir, final String ...exts ) {
         System.out.println ( dir.getAbsolutePath());
         File[] files = dir.listFiles(new FileFilter() {
              public boolean accept(File f) {
                  boolean res = f.isDirectory();
                  for(String s : exts) {
                       if(f.getName().endsWith(s)) {
                           res = true;
                           break;
                       }
                  }
                  return res;
              }
         });
         for(File f : files) {
               if(f.isDirectory()) {
                    listeRepertoire(f, exts);
               }
               else {
                    process();
               }
        }
    }
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  3. #3
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    En fait je pense que mon code précedent peut être optimisé en construisant le FileFilter à l'exterieur de la methode et en le passant en paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public static void listeRepertoire(File dir, FileFilter filter) {
         System.out.println ( dir.getAbsolutePath());
         File[] files = dir.listFiles(filter);
         for(File f : files) {
               if(f.isDirectory()) {
                    listeRepertoire(f, filter);
               }
               else {
                    process();
               }
        }
    }
    Cela évite de créer un objet à chaque appel récursif.
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  4. #4
    Membre régulier Avatar de rgomes
    Homme Profil pro
    IT Developer JAVA Senior
    Inscrit en
    Juin 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : IT Developer JAVA Senior
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 128
    Points : 76
    Points
    76
    Par défaut
    Je ne vois pas ce que ta proposition apporte et surtout en passant le filtre, par exemple "fichier terminant par .xml" je n'aurai plus la liste des répertoires et continuer la récursivité ??

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Le filtre retourne true si c'est un répertoire OU un fichier qui se termine par *.xml

    Et il te permet d'éviter de traiter les autres fichiers...

    a++

  6. #6
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Perso j'utilise les classes suivantes de cette maniere :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    FileTreeWalker walker = new FileTreeWalker(directory, new UnixGlobFileFilter("*.xml"));
    walker.walk(new FileTreeWalk() {
      public void walk(File path) {
        System.out.println(path);
      }
    });
    Tu mets ca dans un thread et puis le probleme est regle. Tu peux utiliser un autre FileFilter que l'UnixGlobFileFilter mais il permet de specifier simplement n'importe quel type de fichier. Les classes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    package org.progx.io;
     
    import java.io.File;
     
    public interface FileTreeWalk {
        public void walk(File path);
    }
    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
     
    package org.progx.io;
     
    import java.io.File;
    import java.io.FileFilter;
    import java.io.IOException;
     
    public class FileTreeWalker {
        private File path;
        private static final FileFilter directoryFilter = new FileFilter() {
            public boolean accept(File pathname) {
                return pathname.isDirectory();
            }
        };
        private FileFilter filter;
     
        public FileTreeWalker(File path) throws IOException {
            this(path, new FileFilter() {
                public boolean accept(File pathname) {
                    return pathname.isFile();
                }
            });
        }
     
        public FileTreeWalker(File path, FileFilter filter) throws IOException {
            if (path == null || !path.exists() || path.isFile()) {
                throw new IOException("Path " + path + " is not a valid directory.");
            }
            this.path = path;
            this.filter = filter;
        }
     
        public void walk(FileTreeWalk walk) {
            walkDirectory(walk, path);
        }
     
        private void walkDirectory(FileTreeWalk walk, File dir) {
            File[] files = dir.listFiles(filter);
            for (File file: files) {
                walk.walk(file);
            }
     
            File[] dirs = dir.listFiles(directoryFilter);
            for (File subDir: dirs) {
                walkDirectory(walk, subDir);
            }
        }
    }
    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
     
    package org.progx.io;
     
    import java.io.FileFilter;
    import java.io.File;
    import java.util.regex.Pattern;
    import java.util.regex.Matcher;
     
    /**
     * User: gfx
     * Date: 3 juin 2005
     * Time: 15:00:22
     */
    public class UnixGlobFileFilter implements FileFilter {
        private Pattern pattern;
     
        public UnixGlobFileFilter(String filter) {
            pattern = Pattern.compile(globToRegex(filter));
        }
     
        public boolean accept(File file) {
            String path = file.getName();
            Matcher matcher = pattern.matcher(path);
            return matcher.matches();
        }
     
        private String globToRegex(String glob) {
            char c = '\0';
            boolean escape = false;
            boolean enclosed = false;
            StringBuffer buffer = new StringBuffer(glob.length());
     
            for (int i = 0; i < glob.length(); i++) {
                c = glob.charAt(i);
     
                if (escape) {
                    buffer.append('\\');
                    buffer.append(c);
                    escape = false;
                    continue;
                }
     
                switch (c) {
                    case '*':
                        buffer.append('.').append('*');
                        break;
                    case '?':
                        buffer.append('.');
                        break;
                    case '\\':
                        escape = true;
                        break;
                    case '.':
                        buffer.append('\\').append('.');
                        break;
                    case '{':
                        buffer.append('(');
                        enclosed = true;
                        break;
                    case '}':
                        buffer.append(')');
                        enclosed = false;
                        break;
                    case ',':
                        if (enclosed)
                            buffer.append('|');
                        else
                            buffer.append(',');
                        break;
                    default:
                        buffer.append(c);
                }
            }
            return buffer.toString();
        }
    }
    Romain Guy
    Android - Mon livre - Mon blog

Discussions similaires

  1. Executer, Parser, arborescence de fichier.
    Par cricrinho dans le forum Windows
    Réponses: 0
    Dernier message: 19/05/2008, 10h31
  2. parser un fichier .dtd
    Par bgranou dans le forum Valider
    Réponses: 2
    Dernier message: 04/06/2004, 19h53
  3. parser des fichier .xml en perl
    Par djibril dans le forum Modules
    Réponses: 13
    Dernier message: 18/05/2004, 17h08
  4. parser un fichier avec xerces
    Par traiangueul dans le forum XML/XSL et SOAP
    Réponses: 9
    Dernier message: 02/02/2004, 18h14
  5. parser un fichier html
    Par noarno dans le forum ASP
    Réponses: 2
    Dernier message: 10/12/2003, 17h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo