• 关于递归函数中最近出现的一些问题自省


    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数组的长度就会变小,减少了内存的占用和循环的次数。

  • 相关阅读:
    深入浅出Vue基于“依赖收集”的响应式原理(转)
    10道初级渗透测试面试题,测测你离职场有多远?
    CTF必备技能丨Linux Pwn入门教程——格式化字符串漏洞
    CTF必备技能丨Linux Pwn入门教程——利用漏洞获取libc
    CTF必备技能丨Linux Pwn入门教程——调整栈帧的技巧
    CTF必备技能丨Linux Pwn入门教程——ROP技术(下)
    用实力燃爆暑期丨i春秋渗透测试工程师线下就业班开课了!
    CTF必备技能丨Linux Pwn入门教程——ROP技术(上)
    CTF必备技能丨Linux Pwn入门教程——ShellCode
    CTF必备技能丨Linux Pwn入门教程——栈溢出基础
  • 原文地址:https://www.cnblogs.com/JSD1207ZX/p/9386221.html
Copyright © 2020-2023  润新知