I have a directory, C:\myDir
.
我有一个目录,C:\ myDir。
under this directory, there may be folders and various files
在这个目录下,可能有文件夹和各种文件
How can I "loop" through this directory and build up a File array of all files with a .properties
extension?
如何“循环”通过此目录并构建一个扩展名为.properties的所有文件的文件数组?
I want to do some processing on these files, the reason for a File[] is to keep it dynamic (so additional properties files added in the future will be included)
我想对这些文件进行一些处理,File []的原因是保持动态(因此将来会添加额外的属性文件)
I'm hoping to do something like this :
我希望做这样的事情:
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 个解决方案
#1
1
Here is a complete answer without external libs:
这是一个没有外部库的完整答案:
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);
}
}
}
}
Call it like this:
这样叫:
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()]);
}
#2
12
Look at FilenameFilter.
看看FilenameFilter。
final FilenameFilter filter = new FilenameFilter() {
public boolean accept(final File directory, final String name) {
return name.endsWith(".properties");
}
};
#3
4
You can use Apache Commons IO FileUtils class for it.
您可以使用Apache Commons IO FileUtils类。
FileUtils.listFiles(File directory, String[] extensions, boolean recursive);
Hope this helps.
希望这可以帮助。
#4
2
Using commons-io FilenameUtils
使用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");
}
});
#5
2
Implemented code which returns files recursing into directories.
实现了返回递归到目录的文件的代码。
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);
}
}
}
}
}
}
}
#6
1
Apache commons IO has a nice class for traversing file systems called DirectoryWalker. If you want to find these properties files recursively, check it out.
Apache commons IO有一个很好的类来遍历名为DirectoryWalker的文件系统。如果要以递归方式查找这些属性文件,请将其签出。
For example, the below code will recursively find image files under a directory and return them as a List.
例如,下面的代码将以递归方式查找目录下的图像文件,并将它们作为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);
}
}
#1
1
Here is a complete answer without external libs:
这是一个没有外部库的完整答案:
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);
}
}
}
}
Call it like this:
这样叫:
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()]);
}
#2
12
Look at FilenameFilter.
看看FilenameFilter。
final FilenameFilter filter = new FilenameFilter() {
public boolean accept(final File directory, final String name) {
return name.endsWith(".properties");
}
};
#3
4
You can use Apache Commons IO FileUtils class for it.
您可以使用Apache Commons IO FileUtils类。
FileUtils.listFiles(File directory, String[] extensions, boolean recursive);
Hope this helps.
希望这可以帮助。
#4
2
Using commons-io FilenameUtils
使用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");
}
});
#5
2
Implemented code which returns files recursing into directories.
实现了返回递归到目录的文件的代码。
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);
}
}
}
}
}
}
}
#6
1
Apache commons IO has a nice class for traversing file systems called DirectoryWalker. If you want to find these properties files recursively, check it out.
Apache commons IO有一个很好的类来遍历名为DirectoryWalker的文件系统。如果要以递归方式查找这些属性文件,请将其签出。
For example, the below code will recursively find image files under a directory and return them as a List.
例如,下面的代码将以递归方式查找目录下的图像文件,并将它们作为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);
}
}