搜索一个目录中的指定文件(此文件可能在N级子目录中)
这个问题用两种方式实现,一个是循环调用,一个是递归方法,两种方法比较,循环调用效率明显高于递归,而递归的好处就是简单,但是递归有一个致命的缺点:容易造成堆栈溢出。
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;elsereturn 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;elsereturn 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;elsereturn 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; }