欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java File删除文件夹完整版 博客分类: java源码分析 javajava.io.filejava删除文件夹垃圾回收 

程序员文章站 2024-03-19 10:51:40
...

       经常写代码,应该能遇到这样一个问题,需要用java删除某个文件夹,如果文件夹下面有子文件夹或文件,可能子文件夹下面还有文件或者文件夹的话,这样直接是删不掉的,什么意思呢,我查遍java file的api,当文件夹下面还存在文件时,并没有直接提供方法删除。为了省事,刚才随便百度了一个,代码比较长,由于我需要删除的子文件夹中存在以“.”开头的文件,于是并不能删除。最后静下来自己写了一个,总共代码就十行左右,但是和一般人的思路都不太一样。

private void deleteFile(String fileName){     
        File file = new File(fileName);  
        if(file.exists()){  
            file.delete();  
        }  
        if(file.exists()){  
             String[] paths = file.list();  
             for(String str:paths){  
                 deleteFile(fileName+"\\"+str);  
             }  
             file.delete();  
        }  
    }  

       这样确实解决了问题,但是细想下,里面还是有些问题的,java不让删除有子文件的文件夹,估计也是为了安全考虑,没有任何提示,一旦删除,那就真没了。那我们来稍微修改下代码:

private void deleteFile(String fileName,boolean isForceDelete){		
		File file = new File(fileName);
		if(file.exists()){
			file.delete();
		}
		if(file.exists()){
			if(!isForceDelete){
				return;
			}
			 String[] paths = file.list();
			 for(String str:paths){
				 deleteFile(fileName+"\\"+str,isForceDelete);
			 }
			 file.delete();
		}
	}

       传这样一个参数,是否强制删除,如果文件夹下面还是文件夹,那就不删除,只要传一个boolean型的参数false就解决了问题。

       看到这,本以为解决了问题,其实还没有,你知道递归的执行效率很低,并且对资源的占用情况随着任务规模的扩大,对资源的占用将呈几何式增长么,你想一下,如果目标文件夹下面存在大量的层级比较深的文件和文件夹时,这时候的执行效率是比较低的,而且很占资源。一旦你选择了递归算法,我觉得执行效率没啥改变了,但是资源占用方面可以有所改变,因此可以从这方面考虑下。这时候不用疑惑,java的GC线程虽然是实时的在检测着,但是一旦系统规模大了,难免有些照应不过了,因此有些垃圾对象可能会删除的有点迟,这里可以查一下,gc回收垃圾的机制有一种是查询对象是否还有被引用,一旦没有被引用,则立即启用回收,准备回收,于是我们可以稍微再改下代码:

private void deleteFile(String fileName,boolean isForceDelete){		
		File file = new File(fileName);
		if(file.exists()){
			file.delete();
		}
		if(file.exists()){
			if(!isForceDelete){
				return;
			}
			 String[] paths = file.list();
			 for(String str:paths){
				 deleteFile(fileName+"\\"+str,isForceDelete);
			 }
			 file.delete();
			 paths = null;	// lets gc do its works
		}
		file = null;	// lets gc do its works
	}

       这样问题应该彻底解决了,虽然我也只是一名菜鸟,但是平时就应该用这样的标准要求自己,平时多研究下,随着经验的积累,总一天别人也会叫你"大牛"、"*哥",至于lets gc do its works 这样的注释写法源于java 源码,java源码都是开放的,建议大家没事多研究下java源码,里面有很多经典的代码。