问题描述
|
FileManager
类具有用于保存文件集合的静态文件,此集合可以包含文件或文件夹,或者两者都包含,文件夹可以包含文件或文件夹,或两者都包含,FileManager
类包含用于客户端代码调用的公共方法,例如addFile
,addFolder
, deleteFile
,deleteFolder
,这些方法作用于集合。我的问题是:
什么Java数据结构最适合这种情况?
如何为文件和文件夹创建模型类?
一些例子会很好。
最好的国王。
//添加@ 2011/05/27
谢谢大家!
我试图建立一个eclipse-rcp应用程序来管理一些jdbc连接配置文件。
这是我的代码:
package com.amarsoft.sysconfig.plugin.model;
/**
* @author ggfan@amarsoft
*
*/
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;
导入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 ggfan@amarsoft
*
*/
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;
}
}
通过这些类,我得到了我的树,但是我发现很难支持添加操作。
解决方法
您已经决定了问题中的答案。
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
类版本,那么对此的JavaDocs应该是理解这一点的一个良好的开端。
至于哪种收集最适合文件收集,我认为12英镑最有意义。拥有一个以上的文件是没有意义的(例如,列表和同一文件的两个条目将毫无意义),并且测试集合的成员资格是一项非常快速的操作。例如,在addFile
中,您可以在尝试添加之前检查它是否存在,对于delete
,类似地,您想要在删除它之前确保它存在。
关于您提到的设计的几点要点。
像这样的静态字段令人讨厌。它们使测试变得困难,并且是多线程的痛苦。您可以将其设置为实例变量吗?
假设ѭ9是路径名的抽象表示,为什么您需要方法addFile
和addFolder
,它们将具有相同的实现?
,文件集合?
大多数集合支持添加和删除,因此不需要特殊的数据结构。 Java File可以是文件和目录。只需调用isDirectory即可确定它是目录还是文件。
除非您有更多要求,否则我认为这将构成一个非常易于使用的FileManager:
List<File> fileManager = new ArrayList<File>();