Java 在目录中搜索特定模式的文件
在Java中,如何递归检查文件夹以查找特定模式的文件?我在网上的许多帖子中看到了以下代码:Java 在目录中搜索特定模式的文件,java,file,recursion,Java,File,Recursion,在Java中,如何递归检查文件夹以查找特定模式的文件?我在网上的许多帖子中看到了以下代码: public static void findFiles() throws IOException { File dir = new File("."); FileFilter fileFilter = new WildcardFileFilter("*.txt"); File[] files = dir.listFiles(fileFilter); for (int i
public static void findFiles() throws IOException {
File dir = new File(".");
FileFilter fileFilter = new WildcardFileFilter("*.txt");
File[] files = dir.listFiles(fileFilter);
for (int i = 0; i < files.length; i++) {
System.out.println(files[i]);
}
}
public static void findFiles()引发IOException{
文件目录=新文件(“.”);
FileFilter FileFilter=新的通配符FileFilter(“*.txt”);
File[]files=dir.listFiles(fileFilter);
对于(int i=0;i
在我的应用程序中,我基本上需要检查用户主目录中与*.txt
匹配的文件
由于每个用户的路径不同,我如何使用此代码在文件系统的任何位置搜索与模式匹配的文件?您实际上可以使用:
final File dir = new File(System.getProperty("user.home"));
这会将dir
设置为用户的home
目录。从这里开始,您只需列出所有.txt
文件,而不是递归;)
但是,如果仍要递归列出目录中的所有文件,可以使用以下方法:
public static List<File> walk(final File root, final String extension) {
final File[] list = root.listFiles();
if (list == null) {
return Collections.EMPTY_LIST;
}
final List<File> res = new ArrayList<>();
for (final File f : list) {
if (f.isDirectory()) {
res.addAll(walk(f, extension));
} else {
if (f.getName().endsWith(extension)) {
res.add(f);
}
}
}
return res;
}
另一方面,如果只想在当前用户的
home
目录中查找文件,则应删除对walk()
的递归调用:
publicstaticlist-walk(最终文件根,最终字符串扩展名){
final File[]list=root.listFiles();
if(list==null){
返回集合。空_列表;
}
最终列表res=新的ArrayList();
用于(最终文件f:列表){
if(f.isFile()&&f.getName().endsWith(扩展名)){
增加(f)项决议;
}
}
返回res;
}
首先,此方法仅检查当前目录新文件(“.”)代码>如果将其更改为递归方法,则可以将每个子目录的路径作为起始目录。我不想为用户的主目录设置属性。我还有什么选择?实际上,这个属性已经被JVM设置好了。但是,这里有一个替代解决方案:)好的,如果我从main调用这个方法,我应该为file参数传递什么参数?当我调用walk-in-main方法时,我如何不指定硬编码的路径:(如果我尝试您提到的user-home-dir-walk(新文件(System.getProperty(“user.home”、“.txt”)),它会挂起。它非常慢。当然会。递归遍历整个用户目录的时间非常长。但是,如果您只想查找用户主目录中的文件,则应该删除对walk
的递归调用。让我演示一下。
public static void main(final String[] args) {
for (final File file : walk(new File("/home/user3751169"), ".txt")) {
System.out.println(file.getAbsolutePath());
}
}
public static List<File> walk(final File root, final String extension) {
final File[] list = root.listFiles();
if (list == null) {
return Collections.EMPTY_LIST;
}
final List<File> res = new ArrayList<>();
for (final File f : list) {
if (f.isFile() && f.getName().endsWith(extension)) {
res.add(f);
}
}
return res;
}