Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在目录中搜索特定模式的文件_Java_File_Recursion - Fatal编程技术网

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

Java中,如何递归检查文件夹以查找特定模式的文件?我在网上的许多帖子中看到了以下代码:

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