2017-05-01 35 views
3

我正在写一个快速的Java递归方法,给定一个根文件夹和文件名,搜索文件的文件名称。递归方法在返回值后继续吗?

import Java.io.File; 

public static String searchForFile(File currentFolder, String filename) 
{ 
    try 
    { 
     File[] path = currentFolder.listFiles(); 

     for (int i = 0; i < path.length; i++) 
     { 
      if (path[i].isDirectory()) 
      { 
       System.out.println("Directory: " + path[i].toString()); 
       searchForFile(path[i], filename); 
      } 
      else 
      { 
       System.out.println("File: " + path[i].toString()); 

       if(path[i].getName().equals(filename)) 
       { 
        System.out.println("Your file has been found!"; 
        return path[i].toString(); 
       } 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

    return null; // Omitting this line yields compiling errors, not sure why? 
} 

public static void main(String[] args) 
{ 
    System.out.println("Hello, enter the root folder and file name."); 
    String rootFolder = "Desktop"; 
    String fileName = "Hello.txt"; 

    File f = new File("C:\\Users\\Me\\" + rootFolder); 
    searchForFile(f, fileName); 

} 

程序本身技术上的工作,但searchForFile()不断迭代请求的文件被发现后还是一样。例如,我会得到一个输出,如:

File: C:\Users\Me\Desktop\My Stuff\NotHello.txt 
**File: C:\Users\Me\Desktop\My Stuff\Hello.txt** 

Your file has been found! 

File: C:\Users\Me\Desktop\My Stuff\AlsoNotHello.txt 
File: C:\Users\Me\Desktop\My Stuff\StillNotHello.txt 
File: C:\Users\Me\Desktop\My Stuff\WhyIsThisMethodStillRunning.txt 

我一直在这里挠我的头一阵子。我认为return总是退出该方法,那么即使它返回一个值,为什么递归仍然继续?我还没有找到任何类似的问题,所以任何帮助将不胜感激!

(另外,我怎么能编辑方法,这样,如果没有找到该请求的文件,它返回一个空字符串""?)

回答

2

您从最里调用返回,当你找到该文件。但是当你扫描一个目录时,你没有使用返回值。

更改此:

searchForFile(path[i], filename); 

到:

String result = searchForFile(path[i], filename); 
if (result != null) { 
    return result; 
} 

在你的方法底部的return null;是有,因为所有的方法需要返回一个值。无论文件是否被找到。如果在当前目录(或其某个子目录)中找不到该文件,则可以使用return null;指示找不到该文件。

小建议:在Java 8中使用Optional而不是null

+0

嗨西蒙,你的建议工作,谢谢你!如果你不介意,你能帮助解释为什么这有效吗? 为什么使用'return searchForFile(path [i],filename);'不工作? –

+1

@RyanA。因为如果你这样做,无论文件是否被找到,你都会返回一个值。假设你的文件在'dir2'中,但是'dir1'也存在。首先搜索dir1,然后你返回searchForFile(dir1,filename)',但是返回'null',因为那里没有文件。那么你'返回null;'和voilá,你的程序会说它找不到你要找的文件。 –