实现类:在给定目录下搜索包含给定关键字的文件和文件夹
在写SeekFile类之前学习了下File类,熟悉了下用到的几个类的用法。
接近尾声的时候,被异常所困扰。在不断调试中,终于发现,在E:\下有隐藏文件夹,导致抛出异常(见标记处):
Exception in thread "main" java.lang.NullPointerException
最后把 if (listPathNameArray[index].isDirectory())
修改为 if (listPathNameArray[index].isDirectory() && !listPathNameArray[index].isHidden())后终于正常了。
java.lang.NullPointerException异常(空指针异常):
指当应用程序试图在需要对象的地方使用null时,抛出空指针异常。这种情况包括调用了未被初始化的对象或不存在的对象。
//
再次寻找抛出空指针异常的原因,目标锁定在文件夹/文件访问权限上(PS:我的是win7系统)。先mark一下。
//
import java.io.File; import java.util.LinkedList; import java.util.Queue; import java.util.Vector; /** * SeekFile类:在给定目录下搜索包含给定关键字的文件和文件夹 */ public class SeekFile/* implements Filter */ { private String pathname; // 指定目录 private CharSequence charSequence; // 指定关键字 private Vector<File> listFitFileArray = new Vector<File>(); // 符合要求的文件名 public SeekFile() {} public SeekFile(String pathname, CharSequence charSequence) { this.pathname = pathname; this.charSequence = charSequence; } // 得到符合要求的路径名数组 public Vector<File> getTheFitFileName() { BreadthFirstSearch(); // 调用广搜方法 return listFitFileArray; // 返回最终结果 } // 广搜 private void BreadthFirstSearch() { Queue<String> queue = new LinkedList<String>(); queue.add(pathname); while (0 != queue.size()) { File newPathname = new File(queue.remove()); // 当前目录 File[] listPathNameArray = newPathname.listFiles(); // 把当前目录下的file和directory存到数组 SelectTheFitFileNameWithSuffix(listPathNameArray); // 挑选符合要求的file的路径名 // 目录入队 for (int index = 0; index < listPathNameArray.length; index++) { if (!listPathNameArray[index].isHidden() // 筛选目录且非隐藏 &&listPathNameArray[index].isDirectory()) // 是否是一个目录 { queue.offer(listPathNameArray[index].toString()); // 这句一直引起异常,标记下 } } } } // 挑选符合要求的路径名 private void SelectTheFitFileNameWithSuffix(File[] listPathNameArray) { for (int index = 0; index < listPathNameArray.length; index++) { if (listPathNameArray[index].isFile() // 是一个标准文件 && !listPathNameArray[index].isHidden() // 非隐藏 && listPathNameArray[index].toString().contains(charSequence)) // 包含关键字 { listFitFileArray.add(listPathNameArray[index]); } } } }
import java.io.File; import java.util.Scanner; import java.util.Vector; public class TestSeekFile { /** * @param args * @author 塘里的潜艇 */ public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("输入目录 关键字"); String pathname = sc.next(); // 指定目录 CharSequence charSequence = sc.next(); // 指定关键字 SeekFile cf = new SeekFile(pathname, charSequence); Vector<File> fileArray = cf.getTheFitFileName(); // 接收符合要求的路径名数组 // 依次打印 for (int index = 0; index < fileArray.size(); index++) { System.out.println(fileArray.get(index)); } } }
/**************************************************************************
                 
原文来自博客园——Submarinex的博客: www.cnblogs.com/submarinex/               
 
*************************************************************************/