java File删除文件夹完整版

       经常写代码,应该能遇到这样一个问题,需要用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源码,里面有很多经典的代码。

 

猜你喜欢

转载自heshifk.iteye.com/blog/2248962
今日推荐