Найти файлы в папке с помощью Java - PullRequest
43 голосов
/ 31 января 2011

Что мне нужно сделать, если поиск в папке скажет C:\example

Затем мне нужно пройти через каждый файл и проверить, совпадает ли он с несколькими начальными символами, поэтому, если файлы начинаются

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

Итак, если файл начинается с temp и имеет расширение .txt, я хотел бы затем поместить это имя файла в File file = new File("C:/example/temp***.txt);, чтобы я мог затем прочитать файл, затем цикл должен перейти к следующему файлу.чтобы проверить, соответствует ли оно, как указано выше.

Ответы [ 12 ]

66 голосов
/ 31 января 2011

То, что вы хотите, это File.listFiles(FileNameFilter filter).

Это даст вам список файлов в каталоге, который вы хотите, которые соответствуют определенному фильтру.

код будет выглядеть примерно так:

// 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");
    }
});
32 голосов
/ 31 января 2011

Вы можете использовать FilenameFilter , например:

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");
  }
});
16 голосов
/ 26 апреля 2017

Я знаю, это старый вопрос.Но только ради полноты, лямбда-версия.

File dir = new File(directory);
File[] files = dir.listFiles((dir1, name) -> name.startsWith("temp") && name.endsWith(".txt"));
4 голосов
/ 16 января 2013

Рассмотрим Apache Commons IO, у него есть класс FileUtils , который имеет метод listFiles, который может быть очень полезен в вашем случае.

4 голосов
/ 31 января 2011

Посмотрите на java.io.File.list() и FilenameFilter.

3 голосов
/ 25 марта 2017

Как сказал @Clarke, вы можете использовать java.io.FilenameFilter для фильтрации файла по определенным условиям.

В качестве дополнения я хотел бы показать, как использовать java.io.FilenameFilter для поиска файла в текущем каталоге и его подкаталоге.

Общие методы getTargetFiles и printFiles используются для поиска файлов ираспечатайте их.

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);
        }
    }
}

Я продемонстрирую, как использовать рекурсивный , bfs и dfs для выполнения работы.

Рекурсивный :

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

Первый поиск в ширину :

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

Первый поиск в глубину :

/ ** * Поиск как можно дальше вдоль каждой ветви перед возвратом * / 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();
}
3 голосов
/ 27 октября 2014

Для вывода списка файлов Json из данного каталога.

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;
        }
    }
3 голосов
/ 05 сентября 2013

Appache использует IO различные

FilenameUtils.wildcardMatch

См. Apache javadoc здесь Он соответствует шаблону с именем файла.Таким образом, вы можете использовать этот метод для своих сравнений.

1 голос
/ 24 апреля 2019

Начиная с Java 1.8, вы можете использовать Files.list для получения потока:

Path findFile(Path targetDir, String fileName) throws IOException {
    return Files.list(targetDir).filter( (p) -> {
        if (Files.isRegularFile(p)) {
            return p.getFileName().toString().equals(fileName);
        } else {
            return false;
        }
    }).findFirst().orElse(null);
}
1 голос
/ 13 июля 2018

Чтобы уточнить этот ответ , Apache IO Utils может сэкономить вам некоторое время. Рассмотрим следующий пример, который будет рекурсивно искать файл с заданным именем:

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

См:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...