如坐春风
人生苦短,要紧跟自己的梦想,爱你所做的事业。
posts - 137,  comments - 257,  trackbacks - 0
文件和目录的基类:
package com.sitinspring;

/**
 * 文件和目录的基类
 * 
@author: sitinspring
 * @date: 2007-12-3
 
*/
public abstract class FileBase {
    
// 名称
    protected String name;

    
// 所在目录
    protected Folder currFolder;

    
// 递归时缩进使用
    protected static final String TAB = "    ";

    
public FileBase(String name) {
        
this.name = name;
    }

    
// 抽象方法,打印本身信息及子元素信息,强制子类使用
    public abstract void printInfo(String tabs);

    
// 取得本身的绝对路径,递归调用上级目录,直到找到根目录为止
    public String getPath() {
        StringBuffer sb 
= new StringBuffer();

        
// 目录指针,初始化时指向当前目录
        Folder folderPointer = currFolder;
        
        
if(folderPointer==null){
            
return "根目录";
        }

        
// 如目录指针不指向空,即未到顶层目录,则继续向上回溯
        while (folderPointer != null) {
            
// 取得的目录名放置在前方
            sb.insert(0, folderPointer.name + "/");
            
            
// 继续向上回溯
            folderPointer = folderPointer.currFolder;
        }

        
// 返回绝对路径
        return sb.toString();
    }

    
public Folder getCurrFolder() {
        
return currFolder;
    }

    
public void setCurrentFolder(Folder folder) {
        
this.currFolder = folder;
    }

    
public String getName() {
        
return name;
    }

    
public void setName(String name) {
        
this.name = name;
    }
}

文件类,继承自FileBase:
package com.sitinspring;

/**
 * 文件类,继承自FileBase
 * 
@author: sitinspring
 * @date: 2007-12-3
 
*/
public class File extends FileBase{    
    
// 文件大小
    private int size;
    
    
public File(String name,int size){
        
super(name);
        
this.size=size;
    }
    
    
// 打印文件信息
    public void printInfo(String tabs){
        System.out.println(tabs
+" Filename="+name+" size="+size+" path="+getPath());
    }

    
public int getSize() {
        
return size;
    }

    
public void setSize(int size) {
        
this.size = size;
    }    
}

目录类,继承自FileBase,可容纳多个文件或目录:
package com.sitinspring;

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

/**
 * 目录类,继承自FileBase,可容纳多个文件或目录
 * 
 * 
@author: sitinspring
 * @date: 2007-12-3
 
*/
public class Folder extends FileBase {
    
// 文件和目录的容器
    private List<FileBase> fileSystems;

    
public Folder(String name) {
        
super(name);
    }

    
// 删除容器中的文件和目录
    public void remove(FileBase fileSystem) {
        fileSystems.remove(fileSystem);
    }

    
// 添加文件或目录到容器中
    public void add(FileBase fileSystem) {
        
if (fileSystems == null) {
            fileSystems 
= new ArrayList<FileBase>();
        }

        fileSystems.add(fileSystem);

        
// 设置添加元素的当前目录
        fileSystem.setCurrentFolder(this);
    }

    
/**
     * 查找空的文件或目录,将结果放置到emptyItems中
     * 
     * 
@param emptyItems
     
*/
    
public void findEmptyFile(List<FileBase> emptyItems) {
        
// 对空目录进行检查,以防空指针异常发生
        if (fileSystems == null) {
            
return;
        }

        
// 遍历查找
        for (FileBase fileSystem : fileSystems) {
            
if (fileSystem instanceof Folder) {
                
// 找到目录
                Folder folder = (Folder) fileSystem;

                
/**
                 * 如果folder.fileSystems == null,则add函数从来没有被调用过,其下必无文件
                 * 如果folder.fileSystems.size()==0,则添加的文件或目录都被删除了 两者满足一个就说明目录下无文件
                 
*/
                
if (folder.fileSystems == null
                        
|| folder.fileSystems.size() == 0) {
                    
// 如果目录下无文件或目录则加入链表emptyItems
                    emptyItems.add(folder);
                } 
else {
                    
// 有子目录则继续向下递归遍历
                    folder.findEmptyFile(emptyItems);
                }

            } 
else {
                
// 找到文件,如果文件大小为空则加入链表emptyItems
                File file = (File) fileSystem;

                
if (file.getSize() == 0) {
                    emptyItems.add(file);
                }
            }
        }
    }
    
    
/**
     * 查找空的文件或目录,将结果直接删除
     * 
     * 
@param emptyItems
     
*/
    
public void removeEmptyFile() {
        
// 对空目录进行检查,以防空指针异常发生
        if (fileSystems == null) {
            
return;
        }

        
// 遍历查找
        for (Iterator it=fileSystems.iterator();it.hasNext();){
            FileBase fileSystem
=(FileBase)it.next();
            
            
if (fileSystem instanceof Folder) {
                
// 找到目录
                Folder folder = (Folder) fileSystem;

                
/**
                 * 如果folder.fileSystems == null,则add函数从来没有被调用过,其下必无文件
                 * 如果folder.fileSystems.size()==0,则添加的文件或目录都被删除了 两者满足一个就说明目录下无文件
                 
*/
                
if (folder.fileSystems == null
                        
|| folder.fileSystems.size() == 0) {
                    
// 如果目录下无文件或目录则加入链表emptyItems
                    it.remove();
                } 
else {
                    
// 有子目录则继续向下递归遍历
                    folder.removeEmptyFile();
                }

            } 
else {
                
// 找到文件,如果文件大小为空则加入链表emptyItems
                File file = (File) fileSystem;

                
if (file.getSize() == 0) {
                    it.remove();
                }
            }
        }
    }

    
/**
     * 打印目录信息
     
*/
    
public void printInfo(String tabs) {
        
// 输出本身的名字
        System.out.println(tabs + " Foldername=" + name + " path=" + getPath());

        
// 对空目录进行检查,以防空指针异常发生
        if (fileSystems == null) {
            
return;
        }

        
// 将容器中的文件目录信息也打印出来
        for (FileBase fileSystem : fileSystems) {
            
// tabs + TAB是让下到一层目录就缩进一次
            fileSystem.printInfo(tabs + TAB);
        }
    }
}


调用过程:
package com.sitinspring;

import java.util.ArrayList;
import java.util.List;

/**
 * 程序入口
 * 
@author: sitinspring
 * @date: 2007-12-3
 
*/
public class Main{
    
public static void main(String[] args){
        
//------------------建立目录结构-----------------------
        File file7=new File("7",0);
        File file6
=new File("6",10);
        Folder folder4
=new Folder("4");
        folder4.add(file6);
        folder4.add(file7);
        
        folder4.add(
new Folder("5"));
        
        File file5
=new File("5",10);
        File file4
=new File("4",10);
        Folder folder3
=new Folder("3");
        folder3.add(file4);
        folder3.add(file5);
        folder3.add(folder4);        
        
        File file2
=new File("2",0);
        File file1
=new File("1",10);
        Folder folder2
=new Folder("2");
        folder2.add(file1);
        folder2.add(file2);
        
        Folder folder1
=new Folder("1");
        folder1.add(folder2);
        folder1.add(folder3);
                
        
        Folder folder0
=new Folder("0");
        folder0.add(folder1);
        
        System.out.println(
"//-----------打印整颗目录树-----------");
        folder0.printInfo(
"");        
        
        
// 找出空的目录和文件
        List<FileBase> emptyItems=new ArrayList<FileBase>();
        folder0.findEmptyFile(emptyItems);
        
        
// 方法一:将空文件目录从其所在目录删除
        for(FileBase fileSystem:emptyItems){
            System.out.println(
"空目录名或文件名为"+fileSystem.getName());
            Folder folder
=fileSystem.getCurrFolder();
            folder.remove(fileSystem);            
        }
        
        
// 方法二:两个方法选择一个执行
        folder0.removeEmptyFile();
        
        System.out.println(
"//-----------打印删除空文件和目录后的目录树-----------");
        folder0.printInfo(
"");
    }    
}


输出:

//-----------打印整颗目录树-----------
 Foldername=0 path=根目录
     Foldername
=1 path=0/
         Foldername
=2 path=0/1/
             Filename
=1 size=10 path=0/1/2/
             Filename
=2 size=0 path=0/1/2/
         Foldername
=3 path=0/1/
             Filename
=4 size=10 path=0/1/3/
             Filename
=5 size=10 path=0/1/3/
             Foldername
=4 path=0/1/3/
                 Filename
=6 size=10 path=0/1/3/4/
                 Filename
=7 size=0 path=0/1/3/4/
                 Foldername
=5 path=0/1/3/4/
空目录名或文件名为2
空目录名或文件名为7
空目录名或文件名为5
//-----------打印删除空文件和目录后的目录树-----------
 Foldername=0 path=根目录
     Foldername
=1 path=0/
         Foldername
=2 path=0/1/
             Filename
=1 size=10 path=0/1/2/
         Foldername
=3 path=0/1/
             Filename
=4 size=10 path=0/1/3/
             Filename
=5 size=10 path=0/1/3/
             Foldername
=4 path=0/1/3/
                 Filename
=6 size=10 path=0/1/3/4/

代码下载:
http://www.blogjava.net/Files/sitinspring/FolderFileAdv20071203212111.rar

同类的另一代码:
http://www.blogjava.net/Files/sitinspring/EnterpriseManageAdv20071203215316.rar
posted on 2007-12-03 20:03 如坐春风 阅读(198) 评论(0)  编辑  收藏 所属分类: Object Orient Programming算法数据结构

标题  
姓名  
主页
验证码 *  
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-12-18 23:20 编辑过
 
 



mail:junglesong@gmail.com
msn:junglesong_5@hotmail.com

Locations of visitors to this page

<2007年12月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

常用链接

留言簿(1)

随笔分类(139)

随笔档案(100)

个人软件下载

我的其它博客

我的邻居们

最新随笔

搜索

  •  

积分与排名

  • 积分 - 92326
  • 排名 - 69

最新评论

阅读排行榜

评论排行榜

60天内阅读排行

如坐春风(http://www.blogjava.net)原创,转载请注明出处.