【问题标题】:How to check a file if exists with wildcard in Java?Java中如何使用通配符检查文件是否存在?
【发布时间】:2012-01-06 00:49:21
【问题描述】:

我有一个目录,里面有文件名为"a_id_XXX.zip"

给定idFile dir,如何检查文件是否存在?

【问题讨论】:

    标签: java file wildcard


    【解决方案1】:

    FileFilter(此处编码为anonymously)传递到目录FilelistFiles() 方法中,如下所示:

    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
    

    【讨论】:

      【解决方案2】:

      我创建了名为 a_id_123.zip ,a_id_124.zip ,a_id_125.zip ,a_id_126.zip 的 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);
                    }
                }
            }
        }
        

      【讨论】:

        【解决方案3】:

        此解决方案概括了 Bohemian 的答案。它使用正则表达式,还用 Java 8 lambda 表达式替换了内部类。感谢@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));
            }
        }
        

        【讨论】:

          【解决方案4】:

          Java 7 对模式匹配 (PathMatcher) 和递归目录遍历 (Files.walkFileTree()) 有一些很好的支持。在原始问题的上下文中,Oracle 的 Java 文档中的这个页面是一个好的开始:

          查找文件:http://docs.oracle.com/javase/tutorial/essential/io/find.html

          【讨论】:

            【解决方案5】:
            【解决方案6】:
            【解决方案7】:

            使用 Java 8 查找具有所需正则表达式条件的目录和子目录中的所有文件

            我的条件是找到所有带有 Audit_Report_xxxxxx.xls 的文件

            // get List of Audit Report file in directory and sub directory
            public List<String> getAuditReporFile(String baseDirectory) throws Exception{
            
                // select all available files in directory and subdirectory
                return Files.walk(Paths.get(baseDirectory))
                        .filter(Files::isRegularFile).filter(x-> {
            
                            // use regex and check if file name is according to our requirement
                            return Pattern.compile("Audit_Report_.*\\.xls").matcher(x.getFileName().toString()).find();
            
                        }).map(x->x.getFileName().toString()).collect(Collectors.toList());
            }
            

            【讨论】:

              猜你喜欢
              • 2021-01-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-11-17
              • 1970-01-01
              相关资源
              最近更新 更多