遍历D盘

来源:互联网 发布:编程软件排行榜2017 编辑:程序博客网 时间:2024/05/29 15:10
刚刚学了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); // 递归遍历此文件夹。}}}}}



原创粉丝点击