2016-06-04 4 views
0

Je ne savais pas très bien comment nommer cette question, mais j'ai une sorte de bug que je ne comprends pas vraiment.Impossible d'ajouter des fichiers à la liste après la récursivité Java

J'ai une méthode qui recherche récursivement les sous-répertoires étiquetés 'calcul' d'un répertoire racine pour son contenu. Et cela semble fonctionner quand j'imprime sur la console. Toutefois, lorsque j'essaie d'ajouter ces fichiers à une liste de fichiers, il semble ne pas fonctionner, la taille est 0 ...

Comment puis-je ajouter ces fichiers à une liste ou un fichier [] ou tout type de structure de données donc je peux les traiter?

Voici mon code:

public static List<File> walkDirectory(String path) { 

    List<File> fileList = new ArrayList<File>(); 

    File root = new File(path); 
    File[] list = root.listFiles(); 

    if (list == null) return null; 

    for (File f : list) { 

     if (f.isDirectory()) { 
      walkDirectory(f.getAbsolutePath()); 
     } 

     else if (f.getParentFile().getName().contains("calculation")) { 
      fileList.add(f); // does not work... 
      System.out.println("File: " + f.getAbsoluteFile()); 

     } 
    } 

    return fileList; 
} 

public static void main(String[] args) { 
    System.out.println(FileWalker.walkDirectory("/path/to/root/directory").size()); // size is 0 
} 

Répondre

2

Déplacez cette ligne List<File> fileList = new ArrayList<File>(); vers l'extérieur de la fonction walkDirectory. Ce qui se passe ici, c'est que vous créez une nouvelle variable fileList chaque fois que vous appelez la fonction.

Soit faire fileList variable statique privée de classe ou passer List argument dans la fonction elle-même.

+0

Voulez-vous que fileList devienne un champ de classe? –

+1

Je pense que vous avez obtenu votre réponse :) si non, n'hésitez pas à demander –

+0

Cela semble fonctionner! Bien que j'aie essayé cela auparavant, je n'avais pas fait l'instanciation de ArrayList en dehors de la méthode –

1
if (f.isDirectory()) { 
     walkDirectory(f.getAbsolutePath()); 
    } 

Vous ne retournez pas ou faire quelque chose avec le résultat de walkDirectory(). Vous souhaitez probablement accumuler les résultats dans une liste et les renvoyer lorsque la boucle est terminée.

+0

Oui c'est ce que j'essaie d'accomplir –