首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

遍历指定文件夹的代码,大家也把自己贴上来吧,希望前辈们也进来指点一下,小弟我想学习学习,提建议的,贴代码的都有分

2012-03-11 
遍历指定文件夹的代码,大家也把自己贴上来吧,希望前辈们也进来指点一下,我想学习学习,提建议的,贴代码的都

遍历指定文件夹的代码,大家也把自己贴上来吧,希望前辈们也进来指点一下,我想学习学习,提建议的,贴代码的都有分。
/**
  *   @(#)Test.java   1.0   2007-07-31
  *   @author   Yuan
  *   @version   1.0
  *   JDK   version   used   1.6.0
  *   */

package   com.sqxy.tools;

import   java.io.File;
import   java.util.List;
import   java.util.ArrayList;

/**
  *   FileTool
  *   */

public   class   FileTool   {
       
       
        //List <File>   directoryList   is   used   to   save   all   directories.        
        private   List <File>   directoryList   =   new   ArrayList <File> ();
       
        //List <File>   fileList   is   used   to   save   all   files.
        private   List <File>   fileList   =   new   ArrayList <File> ();

        /**
          *   @return   the   list   of   all   directories   in   the   directory.
          *   */
        public   List <File>   getDirectoryList()   {
                return   directoryList;
        }

        /**
          *   @return   the   list   of   all   files   in   the   directory.
          *   */
        public   List <File>   getFileList()   {
                return   fileList;
        }
       
        /**
          *   If   the   File   appointed   is   file,
          *   then   print   its   attributes.
          *  
          *   If   the   File   appointed   is   directory,
          *   then   traverse   the   appointed,
          *   add   all   directories   and   files   in   the   directory   to   their   own   list.
          *  
          *   @param   name         the   name   of   the   file   or   path.
          *   */
        public   void   loadFile(String   name)
        {
                //isBeginning用于标记是否是第一次循环
                boolean   isBeginning   =   true;
                File   file   =   new   File(name);
               
                if   (file.isDirectory())


                {
                        for   (int   i   =   0;   i <directoryList.size()
                                                        ||isBeginning;   ){         //第一次循环时directoryList为空
                                File[]   files   =   file.listFiles();
                               
                                if   (isBeginning){                                 //第一次循环是遍历根目录,i不自加。
                                        isBeginning   =   false;                 //第一次循环结束
                                }
                               
                                if   (directoryList.size()   >   0){        
                                        file   =   directoryList.get(i);
                                        i++;
                                }

                                if   (file.isDirectory()  
                                                &&   files!=null           //防NTFS格式分区的System   Volume   Information文件夹造成的I/O错误
                                                &&   files.length   !=   0){

                                        for   (File   tempFile   :   files){
                                                if   (tempFile.isDirectory()){
                                                        directoryList.add(tempFile);
                                                }   else   if   (tempFile.isFile()){


                                                        fileList.add(tempFile);
                                                }
                                        }
                                }
                        }
                }   else   if   (file.isFile())   {
                        System.out.println(file.getName());
                        System.out.println( "是个文件 ");
                        System.out.println(file.canRead()   ?   "可读 "   :   "不可读 ");
                        System.out.println(file.canWrite()   ?   "可写 "   :   "不可写 ");
                }   else   {
                        System.out.println( "非法的文件名或路径! ");
                }
        }
       
        //main方法
        public   static   void   main(String[]   args)
        {
                long   startTimeMillis   =   System.currentTimeMillis();
                long   endTimeMillis;
                FileTool   test   =   new   FileTool();

                test.loadFile(args[0]);

                for(File   directory:test.getDirectoryList())
                {
                        System.out.println( "[ "+directory.getAbsolutePath()+ "] ");
                }

                for(File   file:test.getFileList())
                {
                        System.out.println(file.getAbsoluteFile());
                }

                endTimeMillis   =   System.currentTimeMillis();

                System.out.println( "耗时: "   +   (startTimeMillis   -   endTimeMillis)/1000.0+ "秒 ");
                System.out.println( "文件夹总数: "   +   test.directoryList.size());


                System.out.println( "文件总数: "   +   test.fileList.size());
        }
}


感觉自己写得太长了,而且写这段代码就花了我3小时,唉。。

分数我看着给,我是个菜鸟,给多少只代表我自己的观点,希望大家不要介意分数。


[解决办法]
递归的方法可以吗:) 不到10行代码解决

public void showDirectory(File srcDir) throws IOException {
if (srcDir.isDirectory()) {
System.out.println( "老子是文件夹,看看下面有什么~~ ");
String[] children = srcDir.list();
for (int i=0; i <children.length; i++) {
//递归
showDirectory(new File(srcDir, children[i]));
}
} else {
System.out.println( "老子是个文件而已~~ ");
}
}
[解决办法]
jf
[解决办法]
递归--> 深度优先搜索
非递归--> 广度优先搜索
[解决办法]
public static boolean listFiles(File f) {
if(!f.isDirectory()) {
return false;
}
f.listFiles(new FileFilter() {
public boolean accept(File f1) {
return listFiles(f1);
}
});
}
[解决办法]
我来接分
哈哈
[解决办法]
学习~~~~~~~~~~~~~

[解决办法]
建议散分
[解决办法]
UP
[解决办法]
import java.io.File;
import java.util.Scanner;

public class Tree {

  public static void main(String[] args) {
    
    String path = readPath();
    File file = new File(path);
    if(file.exists()){
      output(file, 0);
    }else{
      System.out.print( " *** ");
      System.out.print(path + " 不存在!!! ");
      System.out.println( " *** ");
    }
  }
  
  private static String readPath(){
    Scanner scanner = new Scanner(System.in);
    System.out.print( "请输入文件夹(目录)路径: ");
    String path = scanner.nextLine();
    return path;
  }
  
  private static void output(File file, int k){
    for(int i=0; i <k; i++){
      System.out.print( " ");
    }
    System.out.println(file.getName());
    if(file.isDirectory()){      
      File[] files = file.listFiles();
      for(File f : files){
        output(f, k+1);
      }
    }
  }
}

可以遍历输出,每进一层采用缩进两个空格处理。
[解决办法]
我把楼上的代码改了一下 想做成树状的 做不出来。。

private static void output(File file, int k) {

for (int i = 0; i < k; i++) {

System.out.print( " ");
}

if (k != 0) {
System.out.print( "|-- ");
}

System.out.println(file.getName());
if (file.isDirectory()) {
File[] files = file.listFiles();
for (File f : files) {


output(f, k + 1);
}
}
}
[解决办法]
大家可以参考 apache commons io,的org.apache.commons.io.FileUtils

TO LZ:

System.out.println( "耗时: " + (startTimeMillis - endTimeMillis)/1000.0+ "秒 ");
System.out.println( "文件夹总数: " + test.directoryList.size());
System.out.println( "文件总数: " + test.fileList.size());

貌似这个测试不能连续反复进行,因为Windows会对目录的遍历结果进行缓存。你可以找一个有1w个以上文件的大文件夹,右键点击属性,可以看到第一次看到大小、个数很慢,一个个在遍历,第二次则很快。
[解决办法]
试试我的这个
import java.io.*;
import java.util.LinkedList;
import java.util.List;

public class FileHeap
{
public static void main(String[] args){
LinkedList <File> list=new LinkedList <File> ();
File dir=new File( "D:\\ ");
File file[]=dir.listFiles();
for(int i=0;i <file.length;i++){
if(file[i].isDirectory())
list.add(file[i]);
else
System.out.println(file[i].getAbsolutePath());
}
File tmp;
while(!list.isEmpty()){
tmp=list.removeFirst();
if(tmp.isDirectory()){
file=tmp.listFiles();
if(file==null)continue;
for(int i=0;i <file.length;i++){
if(file[i].isDirectory())
list.add(file[i]);
else
System.out.println(file[i].getAbsolutePath());
}
}else{
System.out.println(tmp.getAbsolutePath());
}
}
}
}

热点排行