private static void accessDir(File srcDir)
throws IOException {
File[] files = srcDir.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory())
accessDir(files[i]);
else {
//do something
}
}
}

解决方案 »

  1.   

    public static void listFiles(java.io.File file){
        if(file==null){
          return;
        }
        java.io.File[] files = file.listFiles();
        for(int i=0; i<files.length; i++){
          if(files[i].isDirectory()){
            System.out.println("-\t-\t-[Dir]"+files[i].getName());
            listFiles(files[i]);
          }else{
            System.out.println("**[File]"+file.getName());
          }
        }
      }
    列出当前目录下的目录和文件:
        java.io.File file = new java.io.File(".");
        listFiles(file);
      

  2.   

    这个问题很有意思. 关键在于人们很容易忽略目录的深度与广度, 通常使用简单的递归, 这样极容易导致堆栈溢出和 JVM 停止工作. 如上面提供的方法就是这样的. 我们应该尽量避免使用递归. 不用递归也不分配大量资源的方法才是有效的方法.
      

  3.   

    我也在尝试这个问题, 刚刚才下定决心来解决, 下面是查找硬盘中的 "java.exe" 的程序, JVM 绝对不会崩溃,只是效率有待提高. 有谁能加速这个程序的话, 请通知我.
    分析这个过程的状态机请见:
    http://www.yi-dao.com/works/model/sample/findFiles.ydm
    下载这个文档,使用“易道模型”打开,易道模型下载:
    http://www.sharebank.com.cn/soft/soft_view.php?id=11135
    -------------------------------------------------------public class Test{
      public static void main(String[] args) {
        File[] roots = File.listRoots();
        String nameToFind = "java.exe";
        for (int i = 0; i < roots.length; i++) {
          File[] files = findFiles(roots[i], nameToFind);
          for (int j = 0; j < files.length; j++) {
            System.out.println(files[j].getAbsolutePath());
          }
        }
      }
      
      public static File[] findFiles(File dir, String nameToFind) {
        Stack curPath = new Stack();
        curPath.push(dir);
        return findFiles(curPath, nameToFind);
      }  public static final int FIND_SUB = 0; // 找子节点
      public static final int FIND_SIB = 1; // 找同级节点
      public static final int FIND_END = 3; // 结束
      public static File[] findFiles(Stack curPath, String nameToFind) {
        /** 只检测目录 */
        class MyDirFilter
            implements FileFilter {
          public boolean accept(File pathname) {
            return (pathname != null) && pathname.isDirectory();
          }
        }    /** 只检测文件名相同 */
        class MyFileFilter
            implements FileFilter {
          String toFind;
          MyFileFilter(String toFind) {
            this.toFind = toFind;
          }      public boolean accept(File pathname) {
            return (pathname != null) && pathname.isFile()
                && toFind.equalsIgnoreCase(pathname.getName());
          }
        }    MyFileFilter fileFilter = new MyFileFilter(nameToFind);
        MyDirFilter dirFilter = new MyDirFilter();
        int state = FIND_SUB; // 开始
        LinkedHashSet found = new LinkedHashSet();
        while (state != FIND_END) {
          File dir = (File) curPath.pop(); // 当前目录
          // System.out.println(dir.getAbsolutePath());
          if (state == FIND_SUB) { // 查找子节点
            File[] subDirs = dir.listFiles(dirFilter);
            if (subDirs == null || subDirs.length == 0) { // 没有子节点
              curPath.push(dir);
              state = FIND_SIB; // 下一次需要找同级节点
            }
            else {
              curPath.push(dir);
              curPath.push(subDirs[0]);
              state = FIND_SUB;
            }
          }
          else if (state == FIND_SIB) { // 查找同级节点
            File[] files = dir.listFiles(fileFilter);
            if (files != null) {
              for (int i = 0; i < files.length; i++) {
                found.add(files[i]);
              }
            }        if (curPath.isEmpty()) {
              state = FIND_END; // 已经没有可以找的了,需要退出查找过程
            }
            else {
              File parentDir = (File) curPath.peek();
              File[] sibDirs = parentDir.listFiles(dirFilter);
              for (int i = 0; i < sibDirs.length; i++) {
                if (dir.equals(sibDirs[i])) { // 找到了当前的位置
                  if (i + 1 < sibDirs.length) { // 存在下一个同级节点
                    curPath.push(sibDirs[i + 1]);
                    state = FIND_SUB; // 需要查找子节点
                  }
                  else { // 这就是最后一个同级节点
                    state = FIND_SIB;
                  }
                  break;
                }
              }
            }
          }
        }
        return (File[]) found.toArray(new File[found.size()]);
      }
    }
      

  4.   

    String s="中文absdfwe中sfwef哈";
            int n=0;
            for (int i=0;i<s.length();i++)
            {
             if (s.charAt(i) >= 0x4e00 && s.charAt(i) <= 0x9fa5)
             n++;
            }
            System.out.print(n);