我现在正在做一个压缩目录的方法,首先用递归法来历遍各级子目录中的文件,例如public static void listSubDir(File f)
{  
   File fList[]=f.listFiles();
   if(fList!=null)
   {
  for(int i=0;i<fList.length;i++)
  {
  if(fList[i].isDirectory())
  {   
     listSubDir(fList[i]);
  }
  else
  {
   System.out.println("file:"+fList[i].getAbsolutePath()+"");
  }
  }
}
   else
   {    }
}

但我想知道,什么时候到了最后一次的历遍呢?因为是这样的,我要知道最后一步,然后把输出流都关闭掉,算法想不明白,请各位帮帮忙。

解决方案 »

  1.   

    for循环执行完不就是结束了,然后在for循环后面做关闭输出流不就好了?
      

  2.   

    加个flag,遍历过就标记flag,判断flag如果都标记过就是递归遍历完成,关闭就可以了。
      

  3.   

    for循环执行完不就是结束了 这句话似乎也没有错啊 
    只是关闭输出流不能放在for循环后面,因为有字目录的时候也会执行那个循环,如果关闭那下面就进行不下去了
    关闭输出流的位置还是放在这个函数执行后面吧
      

  4.   

    TO lanseliuying:你能具体点吗?TO lovingpig:for结束只能代码,某个子目录历遍完毕,而不是整个根目录历遍完。我就是不想我的这个方法,每次执行完后都加一行close()方法来关毕流,因为很多新手程序员连Connnection都忘记关闭,而不要说一些自写的函数了。
      

  5.   

    在遍历函数中加入变量int flag=0;
    遍历过的节点置flag=1;
    然后用if语句判断是否所有的节点flag都为1,是则结束,否则继续遍历。
      

  6.   

    搂主的程序貌似不像递归!
    fun(){
     if(condition)

          return;}
    }
      

  7.   

    搂主的程序貌似不像递归!
    fun(){
     if(condition)

       dosomething;  
       return;
    }else
    {
      fun()
    }
    }
      
      

  8.   

    public static void listSubDir(File f,boolean flag)
    {  
       File fList[]=f.listFiles();
       if(fList!=null)
       {
      for(int i=0;i<fList.length;i++)
      {
      if(fList[i].isDirectory())
      {   
         listSubDir(fList[i],false);
      }
      else
      {
       System.out.println("file:"+fList[i].getAbsolutePath()+"");
      }
      }
    }
       else
       {    }
               if(flag){
                      //关闭out
               }
    }在调用这个函数的时候flag是true,而子节点递归调用的时候flag传false
    这样似乎可以满足楼住的需要,但是我感觉有点别扭
    不知道有没有更好的办法
      

  9.   

    谢谢lovingpig,不过你的方法也是解决不了我的问题, 试想,我的要求是,当进行后最后一次递归的最后一次循环的时候关闭,而你的代码只能是检测到是文件的时候就关闭。
      

  10.   

    flag为true只会在第一次调用这个函数的时候会调用
    而代码是写在for循环的后面的,你所有的递归都发生在for循环里面,第一次调用函数的那个for循环结束后,那么所有的递归过程都已经结束了
    楼主你再好好想想吧
      

  11.   

    我认为你在打开一个流,进行一系列的操作后,就把流关闭,也就是在一次for循环中可能最后就打开一个文件和关闭一个文件,这和第归没有什么必然的联系,和最后一次也没有什么关系, 例如 for (.....) {
       FileInputStream fis = new FileInputStream("yourPath");
       try {
         ....//文件操作
       } finally {
         fis.close();
       }
     }
      

  12.   

    子目录流关闭 不就是在这里加?
      else
      {
       System.out.println("file:"+fList[i].getAbsolutePath()+"");
       //关闭
      }
    根目录 不就是加个finally{}?