Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.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_Recursion - Fatal编程技术网

如何在Java中递归查找文件?

如何在Java中递归查找文件?,java,recursion,Java,Recursion,我想知道如何编写一个递归程序来定位Java中由起始路径指示的文件。它应该在树中搜索指定的文件。如果找到该文件,则应返回该文件的位置。这就是我到目前为止所拥有的(不多,仍然需要基本的清理)。我需要使用这些精确的方法。我最困惑的是什么是什么方法。所以我知道我需要使用: File f = new File(dirName); String [] fileList = f.list(); File aFile = new File (dirName + "\\" + fileList[i]); i

我想知道如何编写一个递归程序来定位Java中由起始路径指示的文件。它应该在树中搜索指定的文件。如果找到该文件,则应返回该文件的位置。这就是我到目前为止所拥有的(不多,仍然需要基本的清理)。我需要使用这些精确的方法。我最困惑的是什么是什么方法。所以我知道我需要使用:

File f = new File(dirName);

String [] fileList = f.list();

File aFile = new File (dirName + "\\" + fileList[i]);

if (aFile.isDirectory()) {...}

public class FindFile {
如果你能帮我找出每一种方法,那将是一个惊人的帮助!!!我只是没有真正理解每种方法的逻辑。我还需要利用另一个类中的驱动程序

/**
 * This constructor accepts the maximum number of files to find.
 */
public FindFile (int maxFiles)
{
}

/**
 * The parameters are the target file name to look for and the directory to start in.
 * @param  target = target file name, dirName = directory to start in
 */
public void directorySearch (String target, String dirName) {
    File f = new File(dirName);
    String [] fileList = f.list();
    File aFile = new File(dirName + "\\" + fileList[i]);
    if (aFile.isDirectory()) {
    }
    else {
    }
}

/**
 * This accessor returns the number of matching files found.
 * @return number of matching files found
 */
public int getCount () {
    return -1;
}

/**
 * This getter returns the array of file locations, up to maxFiles in size.
 * @return array of file locations
 */
public String [] getFiles () {
    return new String[] {""};
}

/**
 * Prompt the user for max number of files to look for, the directory to start in, and the file name.
 * Then, print out the list of found files with the full path name to the file (including starting
 * directory). In the event of an exception being thrown, driver catches it and provides an appropriate
 * message to the user.
 */
public static void main (String [] args) {
    Scanner keyboard = new Scanner(System.in);
    System.out.println("What is the max number of files to look for?");
    System.out.println("What directory should we start in?");
    Systme.out.println("What is the file name?");
    }

}

您需要使用递归搜索所有文件、目录和子目录中的文件

public static void main(String[] args) {
    boolean found = searchFile(new File("/tmp"), "10174");
    System.out.println(found);
}

private static boolean searchFile(File file, String search) {
    if (file.isDirectory()) {
        File[] files = file.listFiles();
        for (File f : files) {
            boolean found = searchFile(f, search);
            if (found)
                return true;
        }
    } else {
        if (search.equals(file.getName())) {
            return true;
        }
    }
    return false;
}
如果找到,则需要返回文件

static File searchFile(File file, String search) {
    if (file.isDirectory()) {
        File[] arr = file.listFiles();
        for (File f : arr) {
            File found = searchFile(f, search);
            if (found != null)
                return found;
        }
    } else {
        if (file.getName().equals(search)) {
            return file;
        }
    }
    return null;
}

您可以像这样使用Java8Lambda特性

try (Stream<Path> walkStream = Files.walk(Paths.get("your search directory"))) {
    walkStream.filter(p -> p.toFile().isFile()).forEach(f -> {
        if (f.toString().endsWith("file to be searched")) {
            System.out.println(f + " found!");
        }
    });
}
try(Stream walkStream=Files.walk(path.get(“您的搜索目录”)){
walkStream.filter(p->p.toFile().isFile()).forEach(f->{
if(f.toString().endsWith(“要搜索的文件”)){
System.out.println(f+“found!”);
}
});
}

应将其更改为返回找到的文件(或null),而不是布尔值。@Bill Yes,updated answer updated description。@iLove编程更新的答案是您要找的,您尝试过吗?第一个程序只返回布尔值,第二个程序返回文件对象本身,文件有一个返回绝对路径的方法,因此我希望驱动程序将找到的文件列表打印到文件的完整路径名,包括起始目录。并返回找到的匹配文件数。