Java:在目录及其子目录中按文件名搜索文件

11

我需要根据文件名在目录树中查找文件,然后显示该文件的路径。我找到了类似这样的代码,但它是根据扩展名搜索的。有人能帮助我如何修改此代码以符合我的需求吗...谢谢

public class filesFinder {
public static void main(String[] args) {
    File root = new File("c:\\test");

    try {
        String[] extensions = {"txt"};
        boolean recursive = true;


        Collection files = FileUtils.listFiles(root, extensions, recursive);

        for (Iterator iterator = files.iterator(); iterator.hasNext();) {
            File file = (File) iterator.next();
            System.out.println(file.getAbsolutePath());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

你能提供一下你从哪里找到这段代码的链接吗?我不确定FileUtils是否是Java库的一部分,它可能是别人的自定义类...算了,我找到了,链接是http://commons.apache.org/io/apidocs/org/apache/commons/io/FileUtils.html。 - user456814
6个回答

12
public class Test {
    public static void main(String[] args) {
        File root = new File("c:\\test");
        String fileName = "a.txt";
        try {
            boolean recursive = true;

            Collection files = FileUtils.listFiles(root, null, recursive);

            for (Iterator iterator = files.iterator(); iterator.hasNext();) {
                File file = (File) iterator.next();
                if (file.getName().equals(fileName))
                    System.out.println(file.getAbsolutePath());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

@skaryu - 对我来说可以运行...你是否添加了整个块,包括条件? - Udi
但是有一个问题...我需要找到没有扩展名的文件。 - skaryu
好的...现在它的工作方式是这样的: Collection files = FileUtils.listFiles(root, null, recursive); 再次感谢。 - skaryu
如果我只想找一个文件...没有使用FOR循环,应该怎么写? - skaryu

5

在Java中进行递归目录搜索非常容易。 java.io.File类有一个listFiles()方法,可以获取目录的所有File子项;还有一个isDirectory()方法,您可以调用它来确定是否应该递归搜索特定的子项。


Java.io.file的文档可以在http://download.oracle.com/javase/6/docs/api/java/io/File.html找到。 - user456814

2
你可以像这样使用FileFilter。
public class MyFileNameFilter implements FilenameFilter {

@Override
public boolean accept(File arg0, String arg1) {
    // TODO Auto-generated method stub
    boolean result =false;
    if(arg1.startsWith("KB24"))
        result = true;
    return result;
}

并且像这样调用它

File f = new File("C:\\WINDOWS");
    String []  files  = null;
    if(f.isDirectory()) {  
        
        files = f.list(new MyFileNameFilter());
    }
    
    for(String s: files) {
        
        System.out.print(s);
        System.out.print("\t");
    }

Java 8的Lambda表达式使得使用FileNameFilter变得更加容易,只需传递lambda表达式即可。

   File[] filteredFiles =  f.listFiles((file, name) ->name.endsWith(extn));
   

这段代码存在问题:files = f.list(new MyFileNameFilter()); - skaryu
类型recursiveSearch的封闭实例不可访问。必须使用类型recursiveSearch的封闭实例限定分配。 - skaryu
可以在其之上实现的内容。 - sudmong
是的...但我不知道它是什么意思...我只使用Java大约10天 :) - skaryu

0

我不太清楚FileUtils是做什么的,但将扩展名中的“txt”改为“yourfile.whatever”如何?


FileUtils来自于一个Apache Java库,官方网站为http://commons.apache.org/io/apidocs/org/apache/commons/io/FileUtils.html。 - user456814

0
public static File find(String path, String fName) {
    File f = new File(path);
    if (fName.equalsIgnoreCase(f.getName())) return f;
    if (f.isDirectory()) {
        for (String aChild : f.list()) {
            File ff = find(path + File.separator + aChild, fName);
            if (ff != null) return ff;
        }
    }
    return null;
}

0
在目录和嵌套的子目录中查找文件:
import java.io.File;
import java.util.Objects;

public class Solution_LocateUniverseFormula {
    public static void main(String[] args) {
        System.out.println(locateUniverseFormula());
    }

    public static String locateUniverseFormula() {
        File root = new File("C:/tmp/documents/");
        String fileName = "universe-formula";

        File[] files = root.listFiles();

        for (File childFile : files) {
            String filePath = find(childFile, fileName);
            if (!Objects.isNull(filePath)) return filePath;
        }

        return null;
    }

    public static String find(File file, String fileName) {
        if (file.getName().startsWith(fileName)) return file.getAbsolutePath();
        if (file.isDirectory()) {
            for (File childFile : file.listFiles()) {
                String filePath = find(childFile, fileName);
                if (!Objects.isNull(childFile)) return filePath;
            }
        }
        return null;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接