一、需求描述
在指定文件夹下寻找想要的文件,当找到后将该文件返回并中止递归
二、遇到的问题
当找到目标文件后,函数并没有停止,而是向下又进入了条件判断并返回了结果,直到递归次数达到某个限定值才结束。而且奇怪的是,返回的是最后一次递归调用时返回的结果数据
1.问题代码
/**
* dir : 需要扫描的目标文件夹
* str1 : 目标文件的md5Hex值(用来判断文件内容是否一样)
*/
public File queryImg(File dir,String str1) throws IOException{
// 扫描目标文件夹,将其中的子文件夹和图片文件放到ft数组中
File[] ft = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File f) {
if (f.isDirectory())
return true;
String fname = f.getName();
if (fname.endsWith(".jpg") || fname.endsWith(".png") || fname.endsWith(".jpeg"))
return true;
else
return false;
}
});
if (ft.length != 0) {
for (File f : ft) {
// 判断是文件还是文件夹
if (f.isFile()) {
FileInputStream fis = new FileInputStream(f);
// 获取已保存的文件内容
String str2 = DigestUtils.md5Hex(IOUtils.toByteArray(fis));
// 关闭流
IOUtils.closeQuietly(fis);
// 如果两个文件的md5Hex相同,则为相同文件
if (str1.equals(str2)){
return f;
}
} else {
// 如果是文件夹就执行递归调用
queryImg(f,str1);
}
}
}
return null;
}
2.问题解决
找了半天的bug,最终将递归调用处作为返回值返回就可以了。
大致原因应该是: 当找到目标文件后,函数将返回值返回到上一级调用处,而这里的上一级指的其实是上一次递归调用的地方,然而上一次递归调用并没有处理返回值,所以导致递归函数继续执行,直到将目标文件夹下的所有文件全部扫描完才结束
修改后的代码
/**
* dir : 需要扫描的目标文件夹
* str1 : 目标文件的md5Hex值(用来判断文件内容是否一样)
*/
public File queryImg(File dir,String str1) throws IOException{
// 扫描目标文件夹,将其中的子文件夹和图片文件放到ft数组中
File[] ft = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File f) {
if (f.isDirectory())
return true;
String fname = f.getName();
if (fname.endsWith(".jpg") || fname.endsWith(".png") || fname.endsWith(".jpeg"))
return true;
else
return false;
}
});
if (ft.length != 0) {
for (File f : ft) {
// 判断是文件还是文件夹
if (f.isFile()) {
FileInputStream fis = new FileInputStream(f);
// 获取已保存的文件内容
String str2 = DigestUtils.md5Hex(IOUtils.toByteArray(fis));
// 关闭流
IOUtils.closeQuietly(fis);
// 如果两个文件的md5Hex相同,则为相同文件
if (str1.equals(str2)){
return f;
}
} else {
return queryImg(f,str1); // 这里是修改的位置
}
}
}
return null;
}