Java 扫描文件并获取指定文件名的路径 类似于Windows的查找文件功能

今天突然想复习以下File API的相关用法,发现了不少之前没注意到的问题。遂记录如下:

要求:

遍历指定目录,查找到包含所需文件名称的文件,并获取所有满足条件的文件路径。

测试程序如下:

package mytest;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class FileTest
{
	//main方法,调试使用。
	public static void main(String[] args)
	{
		File file = new File("c:/");
		List<String> list = new ArrayList<String>();
		String fileName = "font";
		scanFile(file, fileName, list);
		if (list.size() == 0)
		{
			System.out.println("没有找到文件。");
		} else
		{
			for(String s : list)
			{
				System.out.println("找到文件" + s);
			}
			System.out.println("共有文件" + list.size() + "个");
		}
		
		
	}
	
	//thefile为需要扫描的路径;fileName为需要获取的文件名,支持模糊查找;list为获取到的符合条件的File路径.
	public static void scanFile(File thefile, String fileName, List<String> list)
	{
		//这一句也是调试用的,可以直接将thefile传入下面的语句。
		File file = thefile;
		File[] files = file.listFiles();
		//正常情况下如果文件夹为空,file.listFiles();得到的值应该是files = [];这样的话程序是无误的,
		//但是有时候会出现返回为Null的情况。暂时不知道是什么原因,但是我们依然可以把它当作[]来处理进行跳过。
		//所以需要加这样一句话。将null变成File[0];
//		if(files == null)
//		{
//			files = new File[0];
//		}
		//上面是其中一种思路,其实直接采用下面的思路即可。
		//之前没用采用下面这种思路,是担心遇到file == null的时候递归会中断。
		//看来还是对递归的了解不够深入。
		if(files != null)
		{
		for(File f : files)
		{
			if(f.isFile())
			{
				//这一段是测试在console里面打印输出所有扫描到的文件,仅作调试使用。
				try
				{
					System.out.println("查找中:" + f.getCanonicalPath());
				} catch (IOException e1)
				{
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				
				//若有需要,可以同时传入参数,限制文件的名字。或者用FileFilter也行。
//				if(f.getName().substring(f.getName().length()-3).equals("xml"))
				
				//使用str1.indexOf(str2),只要文件名中包含str2就可以了。
				//用于模糊查找。
				if(f.getName().indexOf(fileName) >= 0)
				{
					try
					{
						list.add(f.getCanonicalPath());
					} catch (IOException e)
					{
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			} else if(f.isDirectory())
			{
				scanFile(f, fileName, list);
			}
		}
		}
	}
}

遇到的问题归结如下:     

1.刚开始是希望通过return 返回获取到的List<String>。但是因为整个方法是递归调用,若在for()语句外面添加return 的话,则在第一次递归时,该方法就会被return。而且确实想不到怎样使用return返回需要的结果。所以直接在参数列表里面传入了我们需要返回的值。利用对象的引用关系,来达到所需的目的。

2.在遍历文件使用.listFiles()方法时遇到大坑。在自己组织的文件路径内程序运行正常,在系统文件范围下比如扫描整个"d:/"盘,总会出现NullPointerExceeption。单步调试后发现,某一些空文件夹.listFiles()会返回null,本以为在遇到空文件夹时.listFiles()均会返回null。单经过自己构造空文件夹的方式测试发现,并非如此。正常情况下空文件夹.listFiles()会返回一个空的数组类似于new File[0]; 经查询似乎和文件夹的访问权限有关系。不过经测试某文件夹.listFiles(); 为null 但是.canRead();为true;所以暂时不太清楚原因。不过确有其结论,所以在遍历前需要判断.listFiles()是否为null以避免出现空指针错误。同时新手恳请赐教,.listFiles(); 为null具体会是什么原因导致的呢。

3.可以同时搭配FileFilter 或者 FileNameFileter 等过滤器来进行更多的筛选。

总结:

        要得到返回值不一定需要用return且可能有的情况下无法使用return;注意.目录路径无误的情况下,listFiles();可能会出现null错误;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值