实现类:在给定目录下搜索包含给定关键字的文件和文件夹

在写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));
		}
	}
}
posted @ 2011-03-28 20:15  SubmarineX  阅读(867)  评论(0编辑  收藏  举报