J'ai récemment dû rechercher récursivement des fichiers dans un répertoire. Je pense que l'API standard de Java a une telle fonction, mais ce n'est pas surprenant.
__2016-12-29 Addendum ___: Bien qu'il soit écrit que ce n'est pas dans la norme, il a été souligné qu'il y a en fait diverses choses. Voir la section des commentaires pour plus de détails.
Par exemple, supposons que vous ayez un répertoire avec la structure suivante:
D:\>tree D:\temp /f
Liste des chemins de dossier:Données de volume
Le numéro de série du volume est C4C7-10BC
D:\TEMP
│ Texte 0.txt
│
├─ Dossier 1
│ │ Texte 1.txt
│ │
│ └─ Dossier 1-1
│ Texte 1-1.txt
│
├─ Dossier 2
│ Texte 1.txt
│
└─ Dossier 3
Texte 3.txt
Pour rechercher de manière récursive des fichiers sous ce D: \ temp
:
package folder;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class FolderUtils {
public static void main(String[] args) {
String absolutePath = "D:\\temp";
List<File> files = FolderUtils.findAllFile(absolutePath);
for (File file : files) System.out.println(file.getAbsolutePath());
// D:\temp\Dossier 2\Texte 1.txt
// D:\temp\Dossier 1\Dossier 1-1\Texte 1-1.txt
// D:\temp\Dossier 1\Texte 1.txt
// D:\temp\Dossier 3\Texte 3.txt
// D:\temp\Texte 0.txt
}
/**
*Recherche récursivement des fichiers dans un répertoire donné.
* @param absolutePath Chemin absolu du répertoire.
* @Liste des fichiers de retour
*/
public static List<File> findAllFile(String absolutePath) {
List<File> files = new ArrayList<>();
Stack<File> stack = new Stack<>();
stack.add(new File(absolutePath));
while (!stack.isEmpty()) {
File item = stack.pop();
if (item.isFile()) files.add(item);
if (item.isDirectory()) {
for (File child : item.listFiles()) stack.push(child);
}
}
return files;
}
}
L'algorithme est une recherche de priorité en profondeur. S'il s'agit d'un répertoire, c'est aussi simple que de chercher en dessous, sinon il est répertorié. J'ai choisi d'implémenter en utilisant des piles au lieu d'appels récursifs compatibles avec la recherche à priorité en profondeur - non pas parce que je voulais mettre en œuvre efficacement - mais parce que je voulais juste savoir que Java avait des piles (je voulais l'utiliser). ´ ・ ω ・ ) Je suis désolé, je n'ai pas de grande raison (´ ・ ω ・
)
Recommended Posts