Как я могу создать файл [] для всех * .properties в данном каталоге? - PullRequest
4 голосов
/ 19 августа 2010

У меня есть каталог, 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) {}

Ответы [ 6 ]

12 голосов
/ 19 августа 2010

Посмотрите на FilenameFilter .

final FilenameFilter filter = new FilenameFilter() {
      public boolean accept(final File directory, final String name) {
        return name.endsWith(".properties");
      }
};
4 голосов
/ 19 августа 2010

Для него можно использовать класс Apache Commons IO FileUtils.

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

Надеюсь, это поможет.

2 голосов
/ 19 августа 2010

Реализован код, который возвращает файлы, возвращающиеся в каталоги.

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

    }

}
2 голосов
/ 19 августа 2010

Использование 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");
    }
});
1 голос
/ 19 августа 2010

Вот полный ответ без внешних библиотек:

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()]);
}
1 голос
/ 19 августа 2010

Apache commons IO имеет хороший класс для обхода файловых систем, который называется DirectoryWalker .Если вы хотите найти эти файлы свойств рекурсивно, проверьте его.

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

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...