我有一个目录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) {}
答案 0 :(得分:12)
final FilenameFilter filter = new FilenameFilter() {
public boolean accept(final File directory, final String name) {
return name.endsWith(".properties");
}
};
答案 1 :(得分:4)
您可以使用Apache Commons IO FileUtils类。
FileUtils.listFiles(File directory, String[] extensions, boolean recursive);
希望这有帮助。
答案 2 :(得分:2)
使用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");
}
});
答案 3 :(得分:2)
实现了返回递归到目录的文件的代码。
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);
}
}
}
}
}
}
}
答案 4 :(得分:1)
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);
}
}
答案 5 :(得分:1)
这是一个没有外部库的完整答案:
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()]);
}