作者:我是完颜康


分享下java 读取目录及子目录下指定文件名的路径 并放到一个List数组里面返回遍历和写到文件里。
由于公司要求读取项目下所有jsp文件,并读取开头的自定义的注释来生成类似javadoc的东西进行页面管理。
而读取jsp源代码需要知道文件的绝对路径,所有通过项目文件夹路径先取出所有jsp文件目录再循环解析。
最后通过搜索和自己的努力写成一个完整的测试类,供以后查阅,同时分享一下。
ps:通过这个测试类,复习了下数组List Iterator io泛型和递归函数,虽然很简单但综合起来用还是遇到了些小问题化了一个多小时调试,例如有些异常文件没有后缀名的用.去判断返回的索引就是-1了,如果没有判断后面的操作就出现异常了,因此我在关键地方加了注释,希望对大家有帮助。

import java.io.*;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List; public class FileViewer {
 public static void main(String[] args) {
    List arrayList =FileViewer.getListFiles("d:/ajax","html",true);
   
    if(arrayList.isEmpty())
    {
    System.out.println("没有符号要求的文件");
    }
    else
    {
     Stringmessage = "";
     message +="符号要求的文件数:" + arrayList.size() + "rn";
    System.out.println(message);
    
     for(Iterator i = arrayList.iterator(); i.hasNext();)
     {
     String temp = (String) i.next();
     System.out.println(temp);
     message += temp + "rn";
     }
    
    appendMethod("d:/ajax/menu.txt",message);
    }
 }
 public static List fileList = new ArrayList();


 public static List getListFiles(String path, String suffix, booleanisdepth)
 {
    File file = newFile(path);
    returnFileViewer.listFile(file ,suffix, isdepth);
 }public static List listFile(File f, String suffix, booleanisdepth)
 {
    //是目录,同时需要遍历子目录
    if (f.isDirectory() &&isdepth == true)
    {
     File[] t =f.listFiles();
     for (int i =0; i < t.length; i++)
     {
     listFile(t[i], suffix, isdepth);
     }
    }
    else
    {
     StringfilePath = f.getAbsolutePath();
    
     if(suffix!=null)
     {
     int begIndex = filePath.lastIndexOf(".");//最后一个.(即后缀名前面的.)的索引
     String tempsuffix = "";
     
     if(begIndex != -1)//防止是文件但却没有后缀名结束的文件
     {
      tempsuffix = filePath.substring(begIndex + 1,filePath.length());
     }
     
     if(tempsuffix.equals(suffix))
     {
      fileList.add(filePath);
     }
     }
     else
     {
     //后缀名为null则为所有文件
     fileList.add(filePath);
     }
    
    }
   
    return fileList;
 }


 public static void appendMethod(String fileName, Stringcontent)
 {
     try
     {
     //打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件
     FileWriter writer = new FileWriter(fileName, true);
     writer.write(content + "rn");
     writer.close();
     }
     catch(IOException e)
     {
     e.printStackTrace();
     }
 }
 }


[转载]java <wbr>读取目录及子目录下指定文件名的路径 <wbr>并放到一个List数组里面返


评论

# re:分享下java 读取目录及子目录下指定文件名的路径 并放到一个List数组里面返回遍历和写到文件里 2008-09-2019:33 kouprey


# re: 分享下java读取目录及子目录下指定文件名的路径 并放到一个List数组里面返回遍历和写到文件里 2008-09-2021:39 流风

写下来主要是复习下知识,和整理下思路,同时也方便以后的重用。
当然如果要细化还是有很多工作可以作的,例如用重载写三个同名函数分别只传入一个,两个,三个参数的,这样使用起来就更加方便了,另外按照惯例优先配置的方法可以采用如果传入某个参数是默认生成什么格式的文件,返回什么格式的值关之类的。

# re: 分享下java读取目录及子目录下指定文件名的路径 并放到一个List数组里面返回遍历和写到文件里[未登录] 2008-09-2023:13 Dennis

以上的 code 有引起 forever recursion 和占用大量多的记忆体的危险

这是一般的 bug pattern
也是 Java 档案操作不好用的原因

Java 没有能力处理进阶 file system 的 symbolic link / hard link / junctionpoint
Java 也不善长作一般的档案操作

要用上 Java7 才引入的 JSR203 NIO2才会得到改善 

# re: 分享下java读取目录及子目录下指定文件名的路径 并放到一个List数组里面返回遍历和写到文件里 2010-02-2221:21 彭玲西

import java.io.*;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;


 public class FileViewer {
 public static void main(String[] args) {
 //List arrayList =FileViewer.getListFiles("d:/com","html",true);

 //读取d:/com下的以java 结尾的文件 如有子目录,包含之(后缀名为null则为所有文件)
 //List arrayList =FileViewer.getListFiles("d:/com","java",true);

 //经试验,后缀不能不填写,否则编译不通过,提示“FileViewer.java:17: 非法的表达式开始”。
 //另外后缀为""时的情况需要 增加到IF 里去,否则 后缀为""时,不会显示所有文件
 List arrayList = FileViewer.getListFiles("d:/com","",true);
 if(arrayList.isEmpty())
 {
 System.out.println("没有符号要求的文件");
 }
 else
 {
 String message = "";
 message += "符号要求的文件数:" + arrayList.size() + "rn";
 System.out.println(message);

 for (Iterator i = arrayList.iterator(); i.hasNext();)
 {
 String temp = (String) i.next();
 System.out.println(temp);
 message += temp + "rn";
 }
 //将显示的文件路径写到指定的文件里,若文件不存在,则提示IO异常
 //java.io.FileNotFoundException: d:ajaxmenu.txt(系统找不到指定的路径。)
 //如果 加个文件是否存在的判断,如不存在就在当前目录新建一个,则更好。
 appendMethod("d:/menu.txt",message);
 }
 }
 public static List fileList = new ArrayList();


 public static List getListFiles(String path, String suffix, booleanisdepth)
 {
 File file = new File(path);
 return FileViewer.listFile(file ,suffix, isdepth);
 }

 public static List listFile(File f, String suffix, booleanisdepth)
 {
 //是目录,同时需要遍历子目录
 if (f.isDirectory() && isdepth == true)
 {
 File[] t = f.listFiles();
 for (int i = 0; i < t.length; i++)
 {
 listFile(t[i], suffix, isdepth);
 }
 }
 else
 {
 String filePath = f.getAbsolutePath();

 System.out.println("suffix = "+suffix);
 if(suffix =="" || suffix == null)
 {
 //后缀名为null则为所有文件
 System.out.println("----------------");
 fileList.add(filePath);
 }
 else
 {
 int begIndex = filePath.lastIndexOf(".");//最后一个.(即后缀名前面的.)的索引
 String tempsuffix = "";

 if(begIndex != -1)//防止是文件但却没有后缀名结束的文件
 {
 tempsuffix = filePath.substring(begIndex + 1,filePath.length());
 }

 if(tempsuffix.equals(suffix))
 {
 fileList.add(filePath);
 }
 System.out.println("|||||||||||||||||||");
 }

 }

 return fileList;
 }


 public static void appendMethod(String fileName, Stringcontent)
 {
 try
 {
 //打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件
 FileWriter writer = new FileWriter(fileName, true);
 writer.write(content + "rn");
 writer.close();
 }
 catch (IOException e)
 {
 e.printStackTrace();
 }
 }
 }