java File删除文件夹完整版 博客分类: java源码分析 javajava.io.filejava删除文件夹垃圾回收
经常写代码,应该能遇到这样一个问题,需要用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源码,里面有很多经典的代码。