用Java创建一个迷你文件系统

时间:2014-10-22 15:59:44

标签: java object tree hashmap filesystems

我有一项任务是创建一个支持有限数量的文件系统操作的迷你文件系统,并在我进行操作时为其添加功能。

我目前正在执行的任务是实现操作ln,它基本上创建了一个指向一个激动人心的目录或文件的链接(将其视为创建文件夹或文件的快捷方式并放置它在另一个文件夹中。)

我的想法是在我的INode类中添加ArrayList,它像指针一样工作,但我似乎无法弄清楚如何访问它们。我意识到这可能是我添加新对象的方式,我认为我得到的是创建另一个基本上像ArrayList<INode> pointer那样工作的pointer.add(new INodeDirectory(paths[i]);,但不确定是否会有效,或者如果这是解决这个问题的最好方法,那么我想我会提出一些指示以及你将如何去做。

一些相关代码:

package se.kth.id1020.minifs;

import edu.princeton.cs.introcs.StdOut;
import java.util.HashMap;

public class MiniFs implements FileSystem {

  private final INodeDirectory root;
  private HashMap<String,Integer> map = new HashMap<String, Integer>();
  private int n = 0; //Number of objects created

  public MiniFs() {
    root = new INodeDirectory("/");
    map.put("/",n);
  }
  //Create a directory/folder
  @Override
  public void mkdir(String path) {
    String paths[] = path.split("/");
    if(paths.length == 2){
        INodeDirectory node = new INodeDirectory(paths[1]);
        n++;
        map.put(paths[1],n);
        StdOut.println("OK.");
    }
    else{
        for(int i = 1; i < paths.length; i++){
            if(i == paths.length - 1){
                if(map.containsKey(paths[i])){
                    StdOut.println("Directory already excists");
                }
                else{
                    INodeDirectory node = new INodeDirectory(paths[i]);
                    n++;
                    map.put(paths[i],n);
                    StdOut.println("OK.");
                }
            }
            else if(map.containsKey(paths[i]) == false){
                throw new UnsupportedOperationException("Error: you have to create " + paths[i] + " first!");
            }
        }
    }
  }
  //Create a file
  @Override
  public void touch(String path) {
    String paths[] = path.split("/");
    if(paths.length == 2){
        INodeFile node = new INodeFile(paths[paths.length - 1]);
        n++;
        map.put(paths[paths.length - 1], n);
        StdOut.println("OK.");
    }
    else{
        for(int i = 1; i < paths.length; i++){
            if(i == paths.length - 1){
                if(map.containsKey(paths[i])){
                    StdOut.println("File already excists");
                } 
                else{
                    INodeFile node = new INodeFile(paths[i]);
                    n++;
                    map.put(paths[i],n);
                    StdOut.println("OK.");
                }
            }
            else if(map.containsKey(paths[i]) == false){
                throw new UnsupportedOperationException("You have to create " + paths[i] + " first!");
            }
        }
    }
  }
}

INode类:

package se.kth.id1020.minifs;

public abstract class INode {

  private String name;

  private long accessTime;

  public INode(String name) {
    this.name = name;
    this.accessTime = System.currentTimeMillis();
  }

  public long getAccessTime() {
    return accessTime;
  }

  public void setAccessTime(long accessTime) {
    this.accessTime = accessTime;
  }

  public String getName() {
    return name;
  }

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

INodeDirectory类:

package se.kth.id1020.minifs;

public class INodeDirectory extends INode {

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

INodeFile类:

package se.kth.id1020.minifs;

public class INodeFile extends INode {

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

1 个答案:

答案 0 :(得分:0)

仍然难以得到你所要求的......

无论如何,请将数据保存在逻辑上所属的位置。 FileSystem在逻辑上完美映射到Composite模式(即节点树)。所有节点都需要真正知道谁是它的父节点(包含它的目录),并且取决于它是模型文件或目录,它的实际二进制内容,还是它的子节点。这些是相互排斥的,因此将它们建模为具有共同祖先的不同类是有意义的(就像您已经做过的那样)。

子节点管理的职责可以逻辑地放在父节点上,根据定义,父节点只能是目录节点。因此目录节点类具有其直接子节点的集合。逻辑上不存在全局名称映射,只需知道其根节点即可访问整个文件系统; 所有都可以通过从根节点开始导航到树中来解决。

“当前目录”的概念可以通过简单地保持对所述目录节点的引用来实现。使用相对路径的操作只是将当前目录节点视为根目录。

在某些时候,您需要区分文件和目录,例如只有一个目录才能管理孩子。有多种方法可以为节点和叶子建模异构API功能(再次查看复合模式:http://en.wikipedia.org/wiki/Composite_pattern)。