遍历D盘

刚刚学了IO流中的文件操作,然后就想着能不能现实一个类似于系统提供的文件搜索。于是就开始动手做了,刚开始思路还是很清晰的,就是用递归遍历某个盘符(我这里递归遍历的是D盘)。
代码写好了,运行之后问题就出来:NullPointerException。重新看了代码之后也看不出什么问题,也请教了老师,老师也觉得代码是没问题的,但是运行的时候就是出现NullPointerException。(崩溃啊。。。)然后我就试着先遍历输出D盘上的所有文件或文件夹。这时候居然出现了4个我D盘上看不见的文件(或文件夹),于是我就再问老师这些是什么文件(或文件夹),不过由于老师也没用过win10系统,所以也不是很了解。
等到晚上我回到宿舍的时候上网查了一下那4个文件(文件夹)是什么,于是了解到了原来是一些与系统有关的文件(文件夹)。不过当时也没想太多,于是就重新打了一遍代码,运行之后还是出现了空指针异常。但是当我递归遍历其它某个文件夹的时候是可以的,所以我就觉得不是代码的问题,但是就是想不出是什么问题。于是我也就没多想去跑步去了,在跑步的时候我突然在想,是不是那4个系统文件(文件夹)是不能遍历的呢?当我跑完步回到宿舍的时候我就试着一个一个的递归遍历D盘上的文件夹,果然当遍历那4个文件夹的时候就出现了NullPointerException,于是我就过滤掉那4个文件夹再一次递归遍历D盘,这次就出现了正确的结果。

好了,说了这么多废话,下面就直接把代码写上吧。

import java.io.File;
import java.util.Scanner;

public class FileSearch {

	/*
	 * 这四个常量值 遍历的时候会出现NullPointerException。
	 * 不过可能不同的电脑会有所差异,我的电脑就是这四个值,但是我宿友的电脑是没有“pagefile.sys”这个文件的。
	 * 我们可以遍历一下D盘,然后把那些隐藏的文件或文件夹逐个试一下哪些会出现NullPointerException或其他异常。
	 */

	/*
	 * $RECYCLE.BIN 文件是系统文件夹,也就是所谓的“回收站”,是不能删除的。
	 */
	final static String RECYCLE_BIN = "$RECYCLE.BIN";

	/*
	 * 微软官方的解释,“System Volume Information 文件夹是一个隐藏的系统文件夹,
	 * 系统还原工具使用此文件夹来存储它的信息和还原点。 计算机的每个分区上都有一个System Volume Information 文件夹。
	 * 为了进行故障排除,可能需要访问此文件夹。”
	 */
	final static String SYSTEM_VOLUME_INFORMATION = "System Volume Information";

	/*
	 * Config.msi文件夹是由Microsoft Installer (MSI,一个提供通用安装接口的程序)生成的, 一般在安装Office
	 * 2000或者SQL Server后产生,该文件夹在磁盘中是隐藏的, 在Windows的安装过程中将产生返回脚本(rollback
	 * scriptS)以实现返回功能。
	 */
	final static String CONFIG_MSI = "Config.Msi";

	/*
	 * pagefile.sys即安装过程中创建的虚拟内存页面文件。
	 * 这个文件的大小是自己系统虚拟内存设置的最小值的大小。假如虚拟内存的设置为800MB-1600MB
	 * 那么你在自己的设定驱动盘下面就可看到大小为800MB的pagefile.sys文件
	 */
	final static String PAGEFILE_SYS = "pagefile.sys";

	public static void main(String[] args) {

		System.out.println("请输入文件名:");
		Scanner sc = new Scanner(System.in);
		String fileName = sc.nextLine();
		
		File dPan = new File("D:\\");	//搜索D盘。

		System.out.println("您所查找的文件如下:");
		search(fileName, dPan);		//调用递归搜索方法。
		sc.close();


	}


	public static void search(String fileName, File pan) {

		// 获取该目录下所有的文件或者文件夹的File数组
		File[] file = pan.listFiles();

		// 增强for遍历该File数组,得到每一个File对象。
		for (File f : file) {
			String name = f.getName(); // 获取每一个File对象的名字。
			if (RECYCLE_BIN.equals(name)
					|| SYSTEM_VOLUME_INFORMATION.equals(name)
					|| CONFIG_MSI.equals(name) || PAGEFILE_SYS.equals(name)) {
				// 如果File对象的名为上面其中的一个则跳过不遍历。
			} else {
				if (f.isFile()) { // 如果File对象是文件。
					
					/*
					 * 这里用的是判断文件名是否是以fileName开头的,
					 * 如果要判断该文件名是否包含fileName则可以用String类的public boolean contains(CharSequence s)方法。
					 */
					if (name.startsWith(fileName)) { 
						System.out.println(f.getAbsolutePath());
					}
				} else { // 如果File对象是文件夹。
					search(fileName, f); // 递归遍历此文件夹。
				}
			}

		}
		
	}
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值