【问题标题】:How can I create a File[] for all *.properties under a given directory?如何为给定目录下的所有 *.properties 创建一个 File[]?
【发布时间】:2011-04-01 03:57:14
【问题描述】:

我有一个目录,C:\myDir

这个目录下可能有文件夹和各种文件

我怎样才能“循环”通过这个目录并建立一个包含所有带有.properties 扩展名的文件的文件数组?

我想对这些文件做一些处理,一个 File[] 的原因是为了让它保持动态(所以将来添加的其他属性文件将被包括在内)

我希望做这样的事情:

public static void main (String[] vargs)
{

   // find all .properties files
   //

   //loop through property file and process
   {
      doSomething(myFile[i]);
   }

}

public void doSomething(File myfile) {}

【问题讨论】:

  • 如果您至少使用 Java5,并且以后需要一个“数组”来动态填充,最好使用 List 而不是 File[]。

标签: java file search


【解决方案1】:

FilenameFilter

final FilenameFilter filter = new FilenameFilter() {
      public boolean accept(final File directory, final String name) {
        return name.endsWith(".properties");
      }
};

【讨论】:

  • 一个强烈的 +1 显示唯一的答案(到目前为止)推荐另一个库来完成这个基本任务。 File.listFiles(FilenameFilter filter) 从 Java 1.2 开始就存在
  • 问题是关于在目录而不是目录中查找文件。
  • @Brian:我看不出有什么不同,但即使有,也不值得投反对票,你不觉得吗?
  • 不同之处在于“under”意味着递归搜索,而“in”则没有。
  • 顺便说一句,我正在回复 Andreas_D 的评论,其中提到了 File.listFiles。
【解决方案2】:

您可以使用 Apache Commons IO FileUtils 类。

FileUtils.listFiles(File directory, String[] extensions, boolean recursive);

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    使用 commons-io FilenameUtils

    final File dir = new File("c:\\myDir");
    final File[] files = dir.listFiles(new FilenameFilter() {
        @Override
        public boolean accept(final File dir, final String name) {
            return FilenameUtils.isExtension(name, "properties");
        }
    });
    

    【讨论】:

      【解决方案4】:

      实现的代码返回递归到目录中的文件。

      import java.io.File;
      import java.util.ArrayList;
      import java.util.List;
      
      
      public class FileList {
          public static void main(String[] args) {
              File dir = new File("/usr/local/work_apps");
      
              String filterExt = "properties";
      
              List<File> fileList = new ArrayList<File>();
      
              getFileteredFiles(dir,filterExt,fileList);
      
              for (File file : fileList) {
                  System.out.println("FileList.main() "+file.getName());
              }
      
          }
      
          /**
           * Get files recursively filtered by file extention.
           * @param dir search directory for.
           * @param filterExt file extention filter.
           * @param fileList List passed to method to be filled with file's.
           */
          public static  void getFileteredFiles(File dir,String filterExt,List<File> fileList){
      
              if(dir.isDirectory()){
                  File[] files = dir.listFiles();
                  if(files != null && files.length > 0){
                  for (File file : files) {
                      if(file.isDirectory()){
                          getFileteredFiles(file, filterExt, fileList);
                      }else{
                          if(file.getName().endsWith("."+filterExt)){
                              fileList.add(file);
                          }
                      }
                  }
                  }
              }
      
          }
      
      }
      

      【讨论】:

      • 迄今为止最简单的示例答案,但它似乎没有在目录上递归搜索:(
      • @James.Elsey 将我的代码更改为递归搜索目录:)。这段代码其实更简单。
      • 是的,但是 a) 您正在为每个子目录创建一个新列表,b) 您正在从您的方法返回一个实现而不是接口(将客户端绑定到 ArrayList 类型的变量而不是 List)和c) 您无法配置您要查找的内容(如果您想要 .txt 或 .xml 怎么办?)
      • @seanizer 更改了我的代码。现在它也处理你所要求的。
      • @naikus 我已经使用 FilenameFilter 给出了解决方案,但这并没有通过目录递归:)。
      【解决方案5】:

      这是一个没有外部库的完整答案:

      public class FileFinder{
      
          public static List<File> findFiles(final File baseDir, final String regex){
              final List<File> files = new ArrayList<File>();
      
              scanFolder(baseDir, Pattern.compile(regex), files);
              return files;
          }
      
          private static void scanFolder(final File dir,
              final Pattern pattern,
              final List<File> files){
      
              for(final File candidate : dir.listFiles()){
                  if(candidate.isDirectory()){
                      scanFolder(candidate, pattern, files);
                  } else if(pattern.matcher(candidate.getName()).matches()){
                      files.add(candidate);
                  }
              }
          }
      
      }
      

      这样称呼它:

      public static void main(String[] args){
          List<File> filesAsList = FileFinder.findFiles(
                                      new File("c:\\my\\dir"), ".*\\.properties");
          File[] filesAsArray = filesAsList.toArray(new File[filesAsList.size()]);
      }
      

      【讨论】:

        【解决方案6】:

        Apache commons IO 有一个很好的用于遍历文件系统的类,称为DirectoryWalker。如果您想递归查找这些属性文件,请查看。

        例如,下面的代码会递归查找目录下的图片文件,并以List的形式返回。

        import com.google.common.collect.Lists;
        import java.io.File;
        import java.io.IOException;
        import java.util.Collection;
        import java.util.List;
        import org.apache.commons.io.DirectoryWalker;
        import org.apache.commons.io.IOCase;
        import org.apache.commons.io.filefilter.AndFileFilter;
        import org.apache.commons.io.filefilter.DirectoryFileFilter;
        import org.apache.commons.io.filefilter.HiddenFileFilter;
        import org.apache.commons.io.filefilter.IOFileFilter;
        import org.apache.commons.io.filefilter.NotFileFilter;
        import org.apache.commons.io.filefilter.OrFileFilter;
        import org.apache.commons.io.filefilter.PrefixFileFilter;
        import org.apache.commons.io.filefilter.SuffixFileFilter;
        
        class SourceImageFinder extends DirectoryWalker {
        
            public SourceImageFinder() {
                // visible directories and image files
                super(new AndFileFilter(notHiddenFileFilter(), new OrFileFilter(imageFileFilter(), DirectoryFileFilter.INSTANCE)), -1);
            }
        
            public List<File> findSourceImages(File directory) {
                List<File> results = Lists.newArrayList();
                try {
                    walk(directory, results);
                } catch (IOException ex) {
                    throw new RuntimeException("Problem finding images", ex);
                }
                return results;
            }
        
            @Override
            protected void handleFile(File file, int depth, Collection results) throws IOException {
                results.add(file);
            }
        
            private static IOFileFilter notHiddenFileFilter() {
                // HiddenFileFilter.HIDDEN doesn't exclude files starting with '.' on Windows but I want to.
                return new NotFileFilter(new OrFileFilter(HiddenFileFilter.HIDDEN, new PrefixFileFilter(".")));
            }
        
            private static IOFileFilter imageFileFilter() {
                return new SuffixFileFilter(new String[]{"png", "jpg", "jpeg", "gif", "bmp", "tif", "tiff"}, IOCase.INSENSITIVE);
            }
        }
        

        【讨论】:

        • 您可以通过添加静态导入 import static org.apache.commons.io.filefilter.FileFilterUtils.* 并使用工厂方法(如 andFileFilter()notFileFilter() 等)来摆脱许多新的 BlaFilter() 调用
        猜你喜欢
        • 2013-06-21
        • 2012-11-13
        • 2017-09-23
        • 2013-09-11
        • 1970-01-01
        • 2021-02-12
        • 1970-01-01
        • 2023-01-26
        • 2022-08-04
        相关资源
        最近更新 更多