您所在的位置:主页 > JAVA技术 >

Java File删除文件夹里所有的文件

时间:2015-10-15 10:58来源:未知 作者:os 点击:

  

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

  Java代码

  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不让删除有子文件的文件夹,估计也是为了安全考虑,没有任何提示,一旦删除,那就真没了。那我们来稍微修改下代码:

  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回收垃圾的机制有一种是查询对象是否还有被引用,一旦没有被引用,则立即启用回收,准备回收,于是我们可以稍微再改下代码:

  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();

  paths = null; // lets gc do its works

  }

  file = null; // lets gc do its works

  }

  这样问题应该彻底解决了,至于lets gc do its works 这样的注释写法源于java 源码,java源码都是开放的,建议大家没事多研究下java源码,里面有很多经典的代码。