web-dev-qa-db-fra.com

Rechercher des fichiers dans un dossier à l'aide de Java

Ce que je dois faire si Rechercher dans un dossier dit C:\example

J'ai ensuite besoin de parcourir chaque fichier et de vérifier s'il correspond à quelques caractères de début, donc si les fichiers démarrent

temp****.txt
tempONE.txt
tempTWO.txt

Donc, si le fichier commence par temp et porte une extension .txt, je voudrais ensuite mettre ce nom de fichier dans un File file = new File("C:/example/temp***.txt); afin que je puisse ensuite le lire dans le fichier. se réunit comme ci-dessus.

40
Sii

Ce que vous voulez, c'est File.listFiles(FileNameFilter filter) .

Cela vous donnera une liste des fichiers dans le répertoire que vous voulez qui correspondent à un certain filtre.

Le code ressemblera à:

// your directory
File f = new File("C:\\example");
File[] matchingFiles = f.listFiles(new FilenameFilter() {
    public boolean accept(File dir, String name) {
        return name.startsWith("temp") && name.endsWith("txt");
    }
});
65
jjnguy

Vous pouvez utiliser un FilenameFilter , comme ceci:

File dir = new File(directory);

File[] matches = dir.listFiles(new FilenameFilter()
{
  public boolean accept(File dir, String name)
  {
     return name.startsWith("temp") && name.endsWith(".txt");
  }
});
30
Mia Clarke

Je sais, c'est une vieille question. Mais juste pour être complet, la version lambda. 

File dir = new File(directory);
File[] files = dir.listFiles((dir1, name) -> name.startsWith("temp") && name.endsWith(".txt"));
9
pan

Considérons Apache Commons IO, il a une classe appelée FileUtils qui a une méthode listFiles qui pourrait être très utile dans votre cas.

3
Waleed Madanat

Regardez Java.io.File.list() et FilenameFilter.

3
jhouse

Pour lister les fichiers Json de votre répertoire donné.

import Java.io.File;
    import Java.io.FilenameFilter;

    public class ListOutFilesInDir {
        public static void main(String[] args) throws Exception {

            File[] fileList = getFileList("directory path");

            for(File file : fileList) {
                System.out.println(file.getName());
            }
        }

        private static File[] getFileList(String dirPath) {
            File dir = new File(dirPath);   

            File[] fileList = dir.listFiles(new FilenameFilter() {
                public boolean accept(File dir, String name) {
                    return name.endsWith(".json");
                }
            });
            return fileList;
        }
    }
2
Ganesa Vijayakumar

Comme @Clarke l'a dit, vous pouvez utiliser Java.io.FilenameFilter pour filtrer le fichier par condition spécifique. 

En complément, je voudrais montrer comment utiliser Java.io.FilenameFilter pour rechercher un fichier dans le répertoire actuel et son sous-répertoire.

Les méthodes courantes getTargetFiles et printFiles sont utilisées pour rechercher des fichiers et les imprimer.

public class SearchFiles {

    //It's used in dfs
    private Map<String, Boolean> map = new HashMap<String, Boolean>();

    private File root;

    public SearchFiles(File root){
        this.root = root;
    }

    /**
     * List eligible files on current path
     * @param directory
     *      The directory to be searched
     * @return
     *      Eligible files
     */
    private String[] getTargetFiles(File directory){
        if(directory == null){
            return null;
        }

        String[] files = directory.list(new FilenameFilter(){

            @Override
            public boolean accept(File dir, String name) {
                // TODO Auto-generated method stub
                return name.startsWith("Temp") && name.endsWith(".txt");
            }

        });

        return files;
    }

    /**
     * Print all eligible files
     */
    private void printFiles(String[] targets){
        for(String target: targets){
            System.out.println(target);
        }
    }
}

Je vais vous montrer comment utiliser recursive , bfs et dfs pour faire le travail.

Récursif :

    /**
 * How many files in the parent directory and its subdirectory <br>
 * depends on how many files in each subdirectory and their subdirectory
 */
private void recursive(File path){

    printFiles(getTargetFiles(path));
    for(File file: path.listFiles()){
        if(file.isDirectory()){
            recursive(file);
        }
    }
    if(path.isDirectory()){
        printFiles(getTargetFiles(path));
    }
}

public static void main(String args[]){
    SearchFiles searcher = new SearchFiles(new File("C:\\example"));
    searcher.recursive(searcher.root);
}

largeur première recherche :

/**
 * Search the node's neighbors firstly before moving to the next level neighbors
 */
private void bfs(){
    if(root == null){
        return;
    }

    Queue<File> queue = new LinkedList<File>();
    queue.add(root);

    while(!queue.isEmpty()){
        File node = queue.remove();
        printFiles(getTargetFiles(node));
        File[] childs = node.listFiles(new FileFilter(){

            @Override
            public boolean accept(File pathname) {
                // TODO Auto-generated method stub
                if(pathname.isDirectory())
                    return true;

                return false;
            }

        });

        if(childs != null){
            for(File child: childs){
                queue.add(child);
            }
        }
    }
}

public static void main(String args[]){
    SearchFiles searcher = new SearchFiles(new File("C:\\example"));
    searcher.bfs();
}

Première recherche en profondeur :

/** * Recherchez autant que possible le long de chaque branche avant de revenir en arrière */ privé void dfs () {

    if(root == null){
        return;
    }

    Stack<File> stack = new Stack<File>();
    stack.Push(root);
    map.put(root.getAbsolutePath(), true);
    while(!stack.isEmpty()){
        File node = stack.peek();
        File child = getUnvisitedChild(node);

        if(child != null){
            stack.Push(child);
            printFiles(getTargetFiles(child));
            map.put(child.getAbsolutePath(), true);
        }else{
            stack.pop();
        }

    }
}

/**
 * Get unvisited node of the node
 * 
 */
private File getUnvisitedChild(File node){

    File[] childs = node.listFiles(new FileFilter(){

        @Override
        public boolean accept(File pathname) {
            // TODO Auto-generated method stub
            if(pathname.isDirectory())
                return true;

            return false;
        }

    });

    if(childs == null){
        return null;
    }

    for(File child: childs){

        if(map.containsKey(child.getAbsolutePath()) == false){
            map.put(child.getAbsolutePath(), false);
        }

        if(map.get(child.getAbsolutePath()) == false){
            return child; 
        }
    }

    return null;
}

public static void main(String args[]){
    SearchFiles searcher = new SearchFiles(new File("C:\\example"));
    searcher.dfs();
}
2
Gearon

Apache commons IO divers

FilenameUtils.wildcardMatch

Voir Apache javadoc ici . Il correspond au caractère générique avec le nom du fichier. Vous pouvez donc utiliser cette méthode pour vos comparaisons.

1
eugene

Pour élaborer sur cette réponse , Apache IO Utils pourrait vous faire gagner du temps. Prenons l'exemple suivant qui recherchera de manière récursive un fichier portant un nom donné:

    File file = FileUtils.listFiles(new File("the/desired/root/path"), 
                new NameFileFilter("filename.ext"), 
                FileFilterUtils.trueFileFilter()
            ).iterator().next();

Voir:

0
Kyle

Vous donnez le nom de votre fichier, le chemin du répertoire dans lequel vous souhaitez effectuer la recherche et vous le laissez effectuer le travail.

private static String getPath(String drl, String whereIAm) {
    File dir = new File(whereIAm); //StaticMethods.currentPath() + "\\src\\main\\resources\\" + 
    for(File e : dir.listFiles()) {
        if(e.isFile() && e.getName().equals(drl)) {return e.getPath();}
        if(e.isDirectory()) {
            String idiot = getPath(drl, e.getPath());
            if(idiot != null) {return idiot;}
        }
    }
    return null;
}
0
Amiel