今天突然想复习以下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错误;