这个问题用两种方式实现,一个是循环调用,一个是递归方法,两种方法比较,循环调用效率明显高于递归,而递归的好处就是简单,但是递归有一个致命的缺点:容易造成堆栈溢出。
import java.io.File;
import java.util.LinkedList;
public class Search {
public static void main(String[] args){
String fileName = "a.txt";
File directory = new File("D:/");
long a = System.currentTimeMillis();
File file1 = searchFile1(fileName,directory);
System.out.println((System.currentTimeMillis()-a) + ":" + file1.getAbsolutePath());
long b = System.currentTimeMillis();
File file2 = searchFile2(fileName,directory);
System.out.println((System.currentTimeMillis()-b)+ ":" + file2.getAbsolutePath());
}
/*
* 递归调用
*/
public static File searchFile1(String fileName, File directory){
if(! directory.isDirectory()){
if(directory.getName().equals(fileName))
return directory;
else
return null;
}
File[] file = directory.listFiles();
File temp = null;
for(int i=0; i<file.length; i++){
temp = searchFile1(fileName, file[i]);
if(temp == null)
continue;
else
return temp;
}
return null;
}
/*
* 循环调用
*/
public static File searchFile2(String fileName, File directory){
//long start = System.currentTimeMillis();
if(! directory.isDirectory()){
if(directory.getName().equals(fileName))
return directory;
else
return null;
}
LinkedList<File> list = new LinkedList<File>();
File[] file = directory.listFiles();
for (int i = 0; i < file.length; i++) {
if (file[i].isDirectory()){
list.add(file[i]);
}else if(file[i].getName().equals(fileName)){
return file[i];
}
}
File temp = null;
while (! list.isEmpty()) {
temp = list.removeFirst();
if (temp.isDirectory()) {
file = temp.listFiles();
if (file == null)
continue;
for (int i = 0; i < file.length; i++) {
if (file[i].isDirectory()){
list.add(file[i]);
}else if(file[i].getName().equals(fileName)){
return file[i];
}
}
} else if(temp.getName().equals(fileName)){
return temp;
}
}
return null;
}