Как проверить файл, если существует с подстановочным знаком в Java? - PullRequest
7 голосов
/ 06 января 2012

У меня есть каталог, и внутри него есть файлы с именами "a_id_XXX.zip".

Как проверить, существует ли файл с учетом id и File dir?

Ответы [ 6 ]

16 голосов
/ 06 января 2012

Передайте FileFilter (закодированный здесь анонимно ) в listFiles() метод dir File, как это:

File dir = new File("some/path/to/dir");
final String id = "XXX"; // needs to be final so the anonymous class can use it
File[] matchingFiles = dir.listFiles(new FileFilter() {
    public boolean accept(File pathname) {
        return pathname.getName().equals("a_id_" + id + ".zip");
    }
});


В комплекте как метод, это будет выглядеть так:

public static File[] findFilesForId(File dir, final String id) {
    return dir.listFiles(new FileFilter() {
        public boolean accept(File pathname) {
            return pathname.getName().equals("a_id_" + id + ".zip");
        }
    });
}

и который можно назвать как:

File[] matchingFiles = findFilesForId(new File("some/path/to/dir"), "XXX");

или просто проверить на существование,

boolean exists = findFilesForId(new File("some/path/to/dir"), "XXX").length > 0
5 голосов
/ 06 января 2012

Я создал zip-файлы с именами a_id_123.zip, a_id_124.zip, a_id_125.zip, a_id_126.zip, и похоже, что работает нормально, но я не уверен, что это правильный ответ для вас.Вывод будет следующим, если файлы, перечисленные выше, существуют

  • найдено a_id_123.zip
  • найдено a_id_124.zip
  • найдено a_id_125.zip
  • найдено a_id_126.zip

    public static void main(String[] args) {
    
        String pathToScan = ".";
        String fileThatYouWantToFilter;
        File folderToScan = new File(pathToScan); // import -> import java.io.File;
        File[] listOfFiles = folderToScan.listFiles();
    
        for (int i = 0; i < listOfFiles.length; i++) {
    
            if (listOfFiles[i].isFile()) {
                fileThatYouWantToFilter = listOfFiles[i].getName();
                if (fileThatYouWantToFilter.startsWith("a_id_")
                        && fileThatYouWantToFilter.endsWith(".zip")) {
                    System.out.println("found" + " " + fileThatYouWantToFilter);
                }
            }
        }
    }
    
2 голосов
/ 01 мая 2014

Это решение обобщает ответ Богемского. Он использует регулярные выражения, а также заменяет внутренний класс лямбда-выражениями Java 8. Спасибо @ Bohemian за оригинальную реализацию.

import java.io.File;

public class FileFinder {
    public static void main(String[] args){
        File directory = new File("D:\\tmp");
        String id = "20140430104033";
        for (File f : findFilenamesWithId(id, directory)){
            System.out.println(f.getAbsoluteFile());
        }
    }

    /** Finds files in the specified directory whose names are formatted 
        as "a_id_ID.zip" */
    public static File[] findFilenamesWithId(String ID, File dir) {
        return findFilenamesMatchingRegex("^a_id_" + ID + "\\.zip$", dir);
    }

    /** Finds files in the specified directory whose names match regex */
    public static File[] findFilenamesMatchingRegex(String regex, File dir) {
        return dir.listFiles(file -> file.getName().matches(regex));
    }
}
1 голос
/ 07 июня 2013

Java 7 имеет хорошую поддержку для сопоставления с образцом (PathMatcher) и рекурсивного обхода каталога (Files.walkFileTree ()). В контексте исходного вопроса эта страница в документации Oracle по Java является хорошим началом:

Поиск файлов: http://docs.oracle.com/javase/tutorial/essential/io/find.html

1 голос
/ 06 января 2012
0 голосов
/ 06 января 2012

Другие ответы или попробуйте муравьиные библиотеки.Вот пример: http://code.google.com/p/maven-replacer-plugin/source/browse/trunk/src/main/java/com/google/code/maven_replacer_plugin/include/FileSelector.java

...