2011-05-26 35 views
1

A FileManager類有一個靜態字段來保存文件集合,此集合可能包含文件或文件夾或兩者,一個文件夾可能包含文件或文件夾或兩者兼有,FileManager類包含客戶端代碼調用的公共方法,如addFileaddFolder,deleteFile,deleteFolder,這些方法對集合進行操作。
我的問題是:
什麼java數據結構最適合這種情況?
如何爲文件和文件夾創建模型類?
在我的情況下使用什麼數據結構?

一些例子會很好。

最好的regars。

//添加@ 2011/05/27 感謝大家! acutaly我試圖建立一個eclipse-rcp應用程序來管理一些jdbc連接配置文件。 這裏是我的代碼:

package com.amarsoft.sysconfig.plugin.model; 

/** 
* @author [email protected] 
* 
*/ 
public class TreeNode { 

    /** 
    * unique key 
    */ 
    private String key; 

    /** 
    * used as label in a JFace TreeViewer, 
    */ 
    private String name; 

    public String getName() { 
     return name; 
    } 

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

    public void setKey(String key) { 
     this.key = key; 
    } 

    public String getKey() { 
     return key; 
    } 


} 

public class LeafNode extends TreeNode { 

    private FolderNode parent; 

    public void setParent(FolderNode parent) { 
     this.parent = parent; 
    } 

    public TreeNode getParent() { 
     return parent; 
    } 
} 

包com.amarsoft.sysconfig.plugin.model;

import java.util.List;

public class FolderNode extends TreeNode { 

    private List<TreeNode> children; 

    public void setChildren(List<TreeNode> children) { 
     this.children = children; 
    } 

    public List<TreeNode> getChildren() { 
     return children; 
    } 
} 




package com.amarsoft.sysconfig.plugin.model; 

import org.dom4j.Element; 
import org.dom4j.tree.DefaultElement; 

/** 
* 連接配置模型類 
* @author [email protected] 
* 
*/ 
public class ConnectionProfile extends LeafNode{ 

    /** 
    * url 
    */ 
    private String url; 

    /** 
    * JDBC driver id 
    */ 
    private int driver; 

    /** 
    * user name for logon 
    */ 
    private String user; 

    /** 
    * password for logon 
    */ 
    private String pswd; 

    /** 
    * default constructor 
    */ 
    public ConnectionProfile() { 

    } 

    /** 
    * construct a instance using a XML element 
    * @param xmlElement the XML element 
    */ 
    public ConnectionProfile(Element xmlElement){ 
     this.setName(xmlElement.attributeValue("name")); 
     this.setUrl(xmlElement.element("url").getTextTrim()); 
     this.setUser(xmlElement.element("user").getTextTrim()); 
     this.setPswd(xmlElement.element("password").getTextTrim()); 
    } 

    /** 
    * serialize as XML 
    * @return 
    */ 
    public Element asXML(){ 
     Element e = new DefaultElement("profile"); 
     e.addAttribute("name", this.getName()); 
     e.addElement("url", escapeNull(this.getUrl())); 
     e.addElement("user", escapeNull(this.getUser())); 
     e.addElement("password", escapeNull(this.getPswd())); 
     return e; 
    } 

    private String escapeNull(String s) { 
     return s == null ? "" : s; 
    } 

    public String getUrl() { 
     return url; 
    } 

    public void setUrl(String url) { 
     this.url = url; 
    } 

    public String getUser() { 
     return user; 
    } 

    public void setUser(String user) { 
     this.user = user; 
    } 

    public String getPswd() { 
     return pswd; 
    } 

    public void setPswd(String pswd) { 
     this.pswd = pswd; 
    } 

    public void setDriver(int driver) { 
     this.driver = driver; 
    } 

    public int getDriver() { 
     return driver; 
    } 

} 

公共類ConnectionProfileManager {

private static List<TreeNode> profiles = new ArrayList<TreeNode>(); 

public static void loadProfiles() throws DocumentException{ 
    Element profiles = XMLUtil.readRoot(ConnectionProfileManager.class.getResourceAsStream("samples_profile.xml")); 
    //Element profiles = XMLUtil.readRoot(new File(ApplicationFiles.CONNNECTION_PROFILES)); 
    if(profiles != null){ 
     for(Element profile : profiles.elements()){ 
      loadNode(profile, ConnectionProfileManager.profiles); 
     } 
    } 
} 


private static void loadNode(Element node, List<TreeNode> parent){ 
    if(node.getName().equals(XMLConstants.CP_TAG_PROFILE)){ 
     ConnectionProfile profile = new ConnectionProfile(node); 
     parent.add(profile); 
    }else if(node.getName().equals(XMLConstants.CP_TAG_FOLDER)){ 
     FolderNode folder = new FolderNode(); 
     folder.setChildren(new ArrayList<TreeNode>()); 
     folder.setName(node.attributeValue(XMLConstants.CP_ATTR_NAME)); 
     for(Element child : node.elements()){ 
      loadNode(child, folder.getChildren()); 
     } 
     parent.add(folder); 
    } 
} 

public static void saveProfiles(){ 
    Element root = new DefaultElement(XMLConstants.CP_TAG_PROFILES); 
    for(TreeNode node : ConnectionProfileManager.profiles){ 
     saveNode(node, root); 
    } 

    XMLUtil.save(root, new File("c:\\1.xml")); 
} 

private static void saveNode(TreeNode node, Element root) { 
    if(node instanceof ConnectionProfile){ 
     ConnectionProfile p = (ConnectionProfile)node; 
     root.add(p.asXML()); 
    }else if(node instanceof FolderNode){ 
     FolderNode folder = (FolderNode)node; 
     Element e = new DefaultElement(XMLConstants.CP_TAG_FOLDER); 
     e.addAttribute(XMLConstants.CP_ATTR_NAME, node.getName()); 
     for(TreeNode child : folder.getChildren()){ 
      saveNode(child, e); 
     } 
     root.add(e); 
    } 
} 


public static void addProfile(ConnectionProfile profile){ 
    profiles.add(profile); 
} 

public static void addProfile(TreeNode parentNode, ConnectionProfile profile){ 

} 

public static List<TreeNode> getProfiles() { 
    return profiles; 
} 

}

這些類,我得到我的樹的作品,但我發現這很難支持添加操作。

+0

這是一門功課還是什麼?順便說一句。這是什麼 – 2011-05-26 09:18:35

+0

我認爲將文件和文件夾保存在一個集合中是件好事,因爲您可以使用遞歸機制通過迭代集合來處理文件和文件夾。 G。如果一個文件夾包含文件,你可以簡單地調用相同的函數來處理它。 – maks 2011-05-26 09:21:33

+0

是不是你的'FileManager'類將*名稱映射到文件(和其他目錄)的*類*目錄? – Kru 2011-05-26 09:30:01

回答

4

你已經在這個問題還挺dictacted答案已經..

File類(根據JavaDocs)的:

文件和目錄路徑名的抽象表示。

從你描述了

所以:

// A file manager class 
class FileManager { 

    // has a static field to hold a file collection 
    static Collection<File> fileCollection; 

    // contains public methods such as 
    public addFile(File f) { } 
    public deleteFile(File f) { } 
    public addFolder(File f) { } 
    public deleteFolder(File f { } 
} 

如果你有看實現自己的File類的版本,則該JavaDoc中應該是一個良好的開端,以瞭解這一點。

由於什麼集合最適合文件集合,我認爲Set是最有意義的。沒有超過一個文件的意義(例如,同一文件的列表和兩個條目將毫無意義),並且測試集合的成員資格是非常快速的操作。例如,在addFile中,您可能在嘗試添加前檢查它是否存在,對於delete類似,您希望在刪除它之前確保它存在。

關於您提到的設計的幾點意見。

  1. 像這樣的靜態字段令人討厭。它們使測試變得困難,並且是多線程的痛苦。你可以讓它成爲一個實例變量?

  2. 鑑於File是一個路徑名的抽象表示,爲什麼你需要方法addFileaddFolder,它們將具有相同的實現?

2

A Collection of File s?

大多數集合的支持添加和刪除,所以不需要特殊的數據結構。 Java文件可以是一個文件和一個目錄。只需撥打isDirectory以查明它是否是目錄或文件。

除非你有更多的需求,我認爲這將構成一個非常易於使用的文件管理器:

List<File> fileManager = new ArrayList<File>(); 
相關問題