Salut à tous,
Est-il possible de limiter un listFiles à un certain nombre.
J'ai un répertoire très volumineux et je souhaite que le listFiles ne remonte pas tous mes fichiers mais un nombre défini.
Est-ce possible ?
Merci
Version imprimable
Salut à tous,
Est-il possible de limiter un listFiles à un certain nombre.
J'ai un répertoire très volumineux et je souhaite que le listFiles ne remonte pas tous mes fichiers mais un nombre défini.
Est-ce possible ?
Merci
Salut,
Tu peux utiliser les FilenameFilter pour cela :
Que tu utilises comme cela :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 class CountFilter implements FilenameFilter { private final int max; private int count; public CountFilter(int max) { this.count = 0; this.max = max; } public boolean accept(File dir, String name) { if (count<max) { count++; return true; } return false; } }
a++Code:File[] files = dir.listFiles(new CountFilter(20));
Mais si c'est juste un problème de performances, ça ne va rien changer, ça va tout parcourir, c'est juste que ça ne va pas ajouter à partir d'un certain nombre...
t'es sur de ça ??
Je suis plutôt d'accord avec ®om, car la méthode accept() est appelée pour chaque fichier afin de vérifier si celui-ci correspond ou non au filtre spécifié (le fait que la méthode accept() renvoie false n'arrête en aucune manière le "listage" des fichiers).Citation:
Envoyé par iohack
Dans le fond, effectivement ça parait logique. D'ailleurs je vois pas trop comment contourner la chose.
Je crois que tu ne peux pas contourner... car voici le code source:Citation:
Envoyé par iohack
Dans la classe File...
Ce fs est déclaré comme ceci:Code:
1
2
3
4
5
6
7 public String[] list() { SecurityManager security = System.getSecurityManager(); if (security != null) { security.checkRead(path); } return fs.list(this); }
Et dans la classe abstraite ayant une visibilité de package FileSystem, la méthode correspondante:Code:static private FileSystem fs = FileSystem.getFileSystem();
C'est du natif... Donc pour changer de comportement, faudrait programmer en C :)Code:public static native FileSystem getFileSystem();
Merci pour votre réponse et pour ce petit "débat" :)
Effectivement, je traite le contenu d'un répertoire qui contient... 800.000 fichiers !!!!
Donc je souhaite déjà traiter les fichiers 10.000 par 10.000 dans un premier temps !!!
Qu'en pensez-vous ?
Qu'appelles-tu "traiter" les fichiers?Citation:
Envoyé par the java lover
Je récupère les fichiers dans un tableau avec le listeFiles et je lis le contenu des fichiers...
Si tu dois traiter tous les fichiers, tu peux utiliser le FilenameFilter pour tes traitements.Citation:
Envoyé par the java lover
En effet si tu dois lire tous les fichiers le plus coûteux ne doit pas venir du parcours des fichiers, mais de la création du tableau de 800000 Files...
Or si tu utilises un FilenameFilter qui renvoit toujours false tu t'évites la création de ce gros tableau, mais comme la méthode est appellé pour tous les fichiers tu peux y placer ton traitement :
a++Code:
1
2
3
4
5
6
7
8
9
10 dir.listFiles(new FilenameFilter() { public boolean accept(File dir, String name) { // Traitement sur le fichier courant : System.out.println("Traitement de " + new File(dir, name) ); // Toujours retourner false return false; } });
J'ai essayé le CountFilter mais il me sort une exception OutOfMemory à chaque exécution.
Des idées ?
Avec combien de fichier ? Tu as essayé de réduire le nombre ? Tu as essayé ma seconde solution ?Citation:
Envoyé par the java lover
a++
Salut,
800.000 fichiers dans le répertoire...
Le problème est que je ne peux pas réduire ce nombre car Windows (ou DOS) est en rade quand j'ouvre le répertoire !!!
Aurais-tu une solution ?
Et comme tu me le disais, même en utilisant un filtre, il parcourt quand même tout d'où le pb de mémoire !!!
Même avec le FileNameFilter il parcourt tout ?
Oui il parcourt tout mais si tu renvoit false il n'ajoute pas le fichier dans le tableau et donc "devrait" consommer moins de mémoire...Citation:
Envoyé par the java lover
Maintenant si tu as ce problème là même au niveau système cela peut bloquer au niveau du code natif : essayes de tracer dans le FilenemFilter pour voir si tu passes dedans ou si ca plante avant...
a++
As-tu essayé simplement
si tu arrives à exécuter cette instruction, tout est possible :DCode:
1
2 String[] tab = fichier.list();
Et pourquoi avoir 800 000 fichiers dans un seul réperoire 8O ?
Moi rien que là je me dis qu'il y a un problème....:aie:
Lol, c'est vrai que c'est étonnant...Citation:
Envoyé par Scorpyosis
Si tu peux déplacer le répertoire problématique, tu pourrais le mettre directement sous la racine du disque dur, tu gagnerais pas mal d'espace lors de ta requête fichier.list(), si le problème vient de là.