Java 如何为给定目录下的所有*.properties创建文件[]?

Java 如何为给定目录下的所有*.properties创建文件[]?,java,file,search,Java,File,Search,我有一个目录,C:\myDir 在此目录下,可能有文件夹和各种文件 我如何“循环”这个目录并建立一个扩展名为.properties的所有文件的文件数组 我想对这些文件进行一些处理,文件[]的原因是保持其动态性(因此将包括将来添加的其他属性文件) 我希望这样做: public static void main (String[] vargs) { // find all .properties files // //loop through property file and

我有一个目录,
C:\myDir

在此目录下,可能有文件夹和各种文件

我如何“循环”这个目录并建立一个扩展名为
.properties
的所有文件的文件数组

我想对这些文件进行一些处理,文件[]的原因是保持其动态性(因此将包括将来添加的其他属性文件)

我希望这样做:

public static void main (String[] vargs)
{

   // find all .properties files
   //

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

}

public void doSomething(File myfile) {}
使用commons io


您可以使用ApacheCommons IO FileUtils类

FileUtils.listFiles(File directory, String[] extensions, boolean recursive);
希望这有帮助。

请看


ApacheCommonsIO有一个很好的类,用于遍历文件系统,名为。如果要递归查找这些属性文件,请将其签出

例如,下面的代码将递归地查找目录下的图像文件,并将它们作为列表返回

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 com.google.common.collect.list;
导入java.io.File;
导入java.io.IOException;
导入java.util.Collection;
导入java.util.List;
导入org.apache.commons.io.DirectoryWalker;
导入org.apache.commons.io.IOCase;
导入org.apache.commons.io.filefilter.AndFileFilter;
导入org.apache.commons.io.filefilter.DirectoryFileFilter;
导入org.apache.commons.io.filefilter.HiddenFileFilter;
导入org.apache.commons.io.filefilter.IOFileFilter;
导入org.apache.commons.io.filefilter.NotFileFilter;
导入org.apache.commons.io.filefilter.OrFileFilter;
导入org.apache.commons.io.filefilter.PrefixFileFilter;
导入org.apache.commons.io.filefilter.suffilefilter;
类SourceImageFinder扩展了DirectoryWalker{
公共SourceImageFinder(){
//可见目录和图像文件
super(new和filefilter(notHiddenFileFilter(),new或filefilter(imageFileFilter(),DirectoryFileFilter.INSTANCE)),-1);
}
公共列表FindSourceImage(文件目录){
列表结果=Lists.newArrayList();
试一试{
步行(目录、结果);
}捕获(IOEX异常){
抛出新的运行时异常(“查找图像问题”,例如);
}
返回结果;
}
@凌驾
受保护的void handleFile(文件、int深度、集合结果)引发IOException{
结果.添加(文件);
}
私有静态IOFileFilter notHiddenFileFilter(){
//HiddenFileFilter.HIDDEN不排除Windows上以“.”开头的文件,但我想。
返回新的NotFileFilter(新的或FileFilter(HiddenFileFilter.HIDDEN,新的PrefixFileFilter(“.”));
}
私有静态IOFileFilter imageFileFilter(){
返回新的后缀文件过滤器(新字符串[]{“png”、“jpg”、“jpeg”、“gif”、“bmp”、“tif”、“tiff”},不区分大小写);
}
}

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

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

    }

}
导入java.io.File;
导入java.util.ArrayList;
导入java.util.List;
公共类文件列表{
公共静态void main(字符串[]args){
File dir=新文件(“/usr/local/work_apps”);
字符串filterText=“属性”;
List fileList=new ArrayList();
getFileTeredFile(目录、过滤器文本、文件列表);
用于(文件:文件列表){
System.out.println(“FileList.main()”+file.getName());
}
}
/**
*获取按文件扩展名递归筛选的文件。
*@param dir搜索目录以查找。
*@param filterText文件扩展名筛选器。
*@param fileList传递给要用文件填充的方法。
*/
公共静态void getFileTeredFile(文件目录、字符串过滤器文本、列表文件列表){
if(dir.isDirectory()){
File[]files=dir.listFiles();
如果(files!=null&&files.length>0){
用于(文件:文件){
if(file.isDirectory()){
getFileTeredFile(文件、过滤器文本、文件列表);
}否则{
if(file.getName().endsWith(“.”+filterText)){
fileList.add(文件);
}
}
}
}
}
}
}

以下是一个没有外部LIB的完整答案:

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

}
公共类文件查找器{
公共静态列表findFile(最终文件baseDir,最终字符串regex){
最终列表文件=新的ArrayList();
scanFolder(baseDir,Pattern.compile(regex),文件);
归还文件;
}
专用静态无效扫描文件夹(最终文件目录,
最终的模式,
最终列表(文件){
对于(最终候选文件:dir.listFiles()){
if(candidate.isDirectory()){
扫描文件夹(候选、模式、文件);
}else if(pattern.matcher(candidate.getName()).matches()){
文件。添加(候选文件);
}
}
}
}
可以这样称呼:

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()]);
}
publicstaticvoidmain(字符串[]args){
List filesAsList=FileFinder.findFiles(
新文件(“c:\\my\\dir”)、“*\\.properties”);
File[]filesasray=filesAsList.toArray(新文件[filesAsList.size()]);
}

strong+1,用于显示(到目前为止)唯一不推荐其他库用于此基本任务的答案
File.listFiles(FilenameFilter filter)
从Java 1.2开始就有了。这个问题是关于在目录下查找文件,而不是在目录中查找文件。@Brian:我看不出有什么区别,但即使有,也不值得投下一票,你不认为吗?区别在于“下”意味着递归搜索,而“中”没有。顺便说一句,我是在回应Andreas_D提到File.listFiles的评论。最简单的示例回答了这个问题,但它似乎没有递归搜索目录:(@James.Elsey将我的代码更改为递归搜索目录:)。这段代码实际上更简单。是的,但是a)您正在为每个子目录创建一个新列表,b)您正在从方法返回一个实现而不是接口(将客户端绑定到ArrayList而不是List类型的变量),c)y
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()]);
}