关于递归函数中最近出现的一些问题自省
package cn.haiyisoft18;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class IO_FILEPRACTICE {
public static void main(String[] args) {
// TODO Auto-generated method stub
//这个练习是我自己想出来的,主要存在的问题是在递归函数中
//new新的对象,如果函数不断进栈,就会不断的new新的对象
//最后导致栈内存溢出,并且在进行file对象判断的时候没有使用过滤器
//对对象进行判断,有可能导致添加了其他的文件
File file = new File("C:\\Users\\zx\\Desktop\\src\\java\\awt");
List<File> L1 = GetFileEndWithJava(file);
System.out.println(L1.size());
for (File file2 : L1) {
System.out.println(file2.getName());
}
}
public static List<File> GetFileEndWithJava(File dir) {
List<File> list = new ArrayList<>();
if (dir.isFile())
list.add(dir);
else {
File[] FA = dir.listFiles(new JavaFileFilter());
for (File file_in : FA) {
if (file_in.isFile())
list.add(file_in);
else
list.addAll(GetFileEndWithJava(file_in));
}
}
return list;
}
}
class JavaFileFilter implements FileFilter {
@Override
public boolean accept(File dir) {
// TODO Auto-generated method stub
// 过滤器设计思想,只保留文件夹以及后缀名是java的文件
if (dir.isDirectory())
return true;
else
return dir.getName().endsWith("java");
}
}
package cn.haiyisoft18;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class IO_FILEPRACTICE2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
File file = new File("C:\\Users\\zx\\Workspaces\\MyEclipse 10\\zx_project");
List<File> list = new ArrayList<>();
FileFilter filter = new JavaFilefilter2(".java");
GetJavaFile(list, file, filter);
System.out.println(list.size());
for (File file2 : list) {
System.out.println(file2.getName());
}
}
public static void GetJavaFile(List<File> list, File dir, FileFilter filter) {
if (dir.isFile() && filter.accept(dir))
list.add(dir);
else {
File[] F1 = dir.listFiles();
for (File file_in : F1) {
if (file_in.isDirectory())
GetJavaFile(list, file_in, filter);
else {
if (filter.accept(file_in))
list.add(file_in);
}
}
}
}
}
class JavaFilefilter2 implements FileFilter {
private String suffxx;
public JavaFilefilter2(String suffxx) {
this.suffxx = suffxx;
}
@Override
public boolean accept(File pathname) {
// TODO Auto-generated method stub
return pathname.getName().endsWith(suffxx);
}
}
package cn.haiyisoft18;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class IO_FILEPRACTICE3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
File file = new File("C:\\Users\\zx\\Desktop\\src");
List<File> list = new ArrayList<File>();
FileFilter filter = new JavaFilefilter3(".java");
GetJavaFile(list, filter, file);
System.out.println(list.size());
for (File file2 : list) {
System.out.println(file2.getName());
}
}
public static void GetJavaFile(List<File> list, FileFilter filter, File dir) {
if (dir.isFile() && filter.accept(dir))
list.add(dir);
else {
File[] FL = dir.listFiles(filter);
for (File file_in : FL) {
if (file_in.isDirectory())
GetJavaFile(list, filter, file_in);
else
list.add(file_in);
}
}
}
}
class JavaFilefilter3 implements FileFilter {
private String suffxx;
public JavaFilefilter3(String suffxx) {
super();
this.suffxx = suffxx;
}
@Override
public boolean accept(File file) {
// TODO Auto-generated method stub
if (file.isDirectory())
return true;
else
return file.getName().endsWith(suffxx);
}
}
这是在看毕向东视频的IO视频的时候写的三段代码,代码的主要用途是获取某文件夹及其子文件夹内后缀为suffxx的文件(后缀的英文单词写错了……),其中用到了递归函数,第一个代码是我自己写的,其中有若干问题,例如判断最开始File对象为文件时没有加判断是否为suffxx结尾的文件,会把其他文件带入到List中,但是最大的问题是在递归函数中new了ArrayList对象,以及Filefilter对象,有递归函数是不断的进栈,这样就会不断的new新的对象,最终可能导致内存溢出,所以在使用递归函数时,尽量不要在函数内new对象,应将外面的对象传入函数。
第二个代码是毕向东的代码,不多说了。
第三个代码是我将我第一个代码和第二个代码结合了一下,主要修改了new对象的部分以及过滤器的使用位置,将需要使用的对象由外部传入,减少了函数递归时不断进栈new对象的问题,我将过滤器直接传入了ListFiles()函数,这样ListFiles返回的FIle数组的长度就会变小,减少了内存的占用和循环的次数。