Trouver des fichiers dans un dossier en utilisant Java

Ce que je dois faire si la Recherche d'un dossier de dire C:example

je dois ensuite passer en revue chaque fichier et vérifier s'il correspond à quelques caractères de départ donc si les fichiers commencent

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

donc si le fichier commence avec temp et a une extension .txt je voudrais alors mettre ce nom de fichier dans un File file = new File("C:/example/temp***.txt); donc je peux alors lire dans le fichier, la boucle doit alors passer dans le fichier suivant pour vérifier si elle se rencontre comme ci-dessus.

39
demandé sur jjnguy 2011-01-31 18:18:27

9 réponses

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

Qui va vous donner 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");
    }
});
62
répondu jjnguy 2011-01-31 15:22:08

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
répondu Mia Clarke 2011-01-31 15:25:07

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"));
7
répondu pan 2017-04-26 10:02:58

regardez java.io.File.list() et FilenameFilter.

3
répondu jhouse 2013-01-16 14:57:14

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

3
répondu Waleed Madanat 2018-03-19 16:27:11

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
répondu Ganesa Vijayakumar 2014-10-27 04:59:48

comme @Clarke l'a dit, Vous pouvez utiliser java.io.FilenameFilter pour filtrer le fichier par condition spécifique.

en complément, j'aimerais vous montrer comment utiliser java.io.FilenameFilter pour rechercher le fichier dans le répertoire courant et ses 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 démo comment utiliser récursive, bfs et dfs pour obtenir le travail faire.

Récursive:

    /**
 * 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();
}

Profondeur Première Recherche:

/** * Recherche autant que possible le long de chaque branche avant de mandature */ private 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
répondu Gearon 2017-03-25 15:03:02

Appache commons IO various

FilenameUtils.wildcardMatch

Voir Apache javadoc ici. Il correspond au Joker avec le nom du fichier. Vous pouvez donc utiliser cette méthode pour vos comparaisons.

1
répondu eugene 2015-11-30 09:52:38

pour développer sur cette réponse, Apache pourrait vous faire gagner du temps. Considérez l'exemple suivant qui va rechercher récursivement un fichier d'un nom:

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

Voir:

0
répondu Kyle 2018-07-13 16:24:53