黑马程序员技术交流社区

标题: 用Io操作写一个读文件夹里的所有的.java出现问题了.... [打印本页]

作者: 卍解    时间: 2012-11-25 20:46
标题: 用Io操作写一个读文件夹里的所有的.java出现问题了....
  1. package com.files;

  2. import java.io.*;
  3. import java.util.*;

  4. public class FilesTest2 {

  5.         /**
  6.          * @param args
  7.          */
  8.         public static void main(String[] args) {
  9.                 // TODO Auto-generated method stub
  10.                 File a=new File("G:\\JAVAWORK\\Io");
  11.                 List <File>list=new ArrayList<File>();
  12.                 FileToList(a,list);
  13.                 System.out.println(list.size());
  14.                 try {
  15.                         FileToWriter(list,"c:/a.txt");
  16.                 } catch (Exception e) {
  17.                         // TODO Auto-generated catch block
  18.                         e.printStackTrace();
  19.                 }
  20.         }
  21.         public static void FileToList(File dir,List<File> list){//递归查找文件夹的文件
  22.                 File [] file=dir.listFiles();
  23.                 for(File a:file){
  24.                         if(a.isDirectory())
  25.                                 FileToList(dir,list);
  26.                         else
  27.                         {
  28.                                 if(a.getName().endsWith(".java"))
  29.                                         list.add(a);
  30.                         }
  31.                 }
  32.         }
  33.         public static void FileToWriter(List<File> list,String file)throws Exception{//把是.java文件读入c:/a.txt
  34.                 BufferedWriter bw=new BufferedWriter(new FileWriter(file));
  35.                 for(File a:list){
  36.                         String path=a.getAbsolutePath();
  37.                         bw.write(path);
  38.                         bw.newLine();
  39.                 }
  40.                 bw.flush();
  41.                 bw.close();
  42.         }
  43. }
复制代码
读一个文件下没有子文件夹没问题,读一文件下有子文件夹就会出现以下问题:
Exception in thread "main" java.lang.StackOverflowError
        at java.io.Win32FileSystem.resolve(Win32FileSystem.java:237)
        at java.io.File.<init>(File.java:207)
        at java.io.File.listFiles(File.java:1056)
        at com.files.FilesTest2.FileToList(FilesTest2.java:25)
        at com.files.FilesTest2.FileToList(FilesTest2.java:28)
        at com.files.FilesTest2.FileToList(FilesTest2.java:28)
        at com.files.FilesTest2.FileToList(FilesTest2.java:28)
        at com.files.FilesTest2.FileToList(FilesTest2.java:28)
        at com.files.FilesTest2.FileToList(FilesTest2.java:28)
        at com.files.FilesTest2.FileToList(FilesTest2.java:28)




作者: 徐军涛    时间: 2012-11-25 20:54

public static void FileToList(File dir,List<File> list){//递归查找文件夹的文件
             File [] file=dir.listFiles();
              for(File a:file){
                       if(a.isDirectory())

                               FileToList(dir,list);//此处,你一直在递归dir,肯定会造成StackOverflowError
                                                        //把dir改成a即可                                                               
                       else

                       {

                               if(a.getName().endsWith(".java"))

                                      list.add(a);
                        }

                }
}

作者: 卍解    时间: 2012-11-25 21:01
徐军涛 发表于 2012-11-25 20:54
public static void FileToList(File dir,List list){//递归查找文件夹的文件
             File [] file ...

呵呵,我也是刚刚看出问题。如果是file不停的找根文件中的文件。跳不出方法了。粗心了。。。。。。
作者: yzqiong5566    时间: 2012-11-25 21:01
本帖最后由 yzqiong5566 于 2012-11-25 21:03 编辑

比较正确的代如下:
  1. package com.files;
  2. import java.io.*;
  3. import java.util.*;

  4. public class FilesTest2 {

  5.         /**
  6.          * @param args
  7.          */
  8.         public static void main(String[] args) {
  9.                 // TODO Auto-generated method stub
  10.                  File a=new File("G:\\JAVAWORK\\Io");
  11.                 List<File> list = new ArrayList<File>();
  12.                 FileToList(a, list);
  13.                 System.out.println(list.size());
  14.                 try {
  15.                         FileToWriter(list, "c:/a.txt");
  16.                 } catch (Exception e) {
  17.                         e.printStackTrace();
  18.                 }
  19.         }

  20.         public static void FileToList(File dir, List<File> list) {// 递归查找文件夹的文件
  21.                 File[] file = dir.listFiles();
  22.                 for (File a : file) {
  23.                         if (a.isDirectory())
  24.                                FileToList(a, list);//传递的是子目录,而不是把顶层目录传给它
  25.                         else {
  26.                                 if (a.getName().endsWith(".java"))
  27.                                         list.add(a);
  28.                         }
  29.                 }
  30.         }

  31.         public static void FileToWriter(List<File> list, String file)
  32.                         throws Exception {// 把是.java文件读入c:/a.txt
  33.                 BufferedWriter bw = new BufferedWriter(new FileWriter(file));
  34.                 for (File a : list) {
  35.                         String path = a.getAbsolutePath();
  36.                         bw.write(path);
  37.                         bw.newLine();
  38.                         bw.flush();
  39.                 }
  40.                 bw.flush();
  41.                 if (bw != null) {//健壮性,其他地方就不改了
  42.                         bw.close();
  43.                         bw = null;
  44.                 }
  45.         }
  46. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2