2014-10-22 3 views
0

제한된 수의 파일 시스템 작업을 지원하고 그에 따라 기능을 추가하는 미니 파일 시스템을 생성하는 임무가 있습니다.Java에서 미니 파일 시스템 만들기

나는 현재 excisting 디렉토리 또는 파일에 대한 링크를 만드는 작업 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!"); 
      } 
     } 
    } 
    } 
} 

아이 노드 클래스 :

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); 
    } 
} 
+0

적어도 간결한 대답을 원한다면 간결한 질문을 할 수 있습니다. 현재로서는 귀하의 질문이 SO와 잘 맞지 않습니다. – Durandal

+0

@Durandal 예 나는 약간의 이별이있어, 이제 내 질문을 편집했다. 희망이 나아 졌어. – Necrozze

답변

0

아직도 묻고있는 것을 얻기가 어렵습니다.

어쨌든 논리적으로 속하는 데이터를 보관하십시오. FileSystem은 복합 패턴 (노드 트리)에 논리적으로 완벽하게 매핑됩니다. 모든 노드가 실제로 알아야하는 것은 부모 (그 노드를 포함하고있는 디렉토리)와 파일 또는 디렉토리, 실제 바이너리 컨텐츠 또는 자식 노드를 모델링하는지 여부에 따라 다릅니다. 이것은 상호 배타적이므로 공통 조상을 가진 다른 클래스로 모델링하는 것이 좋습니다 (이미 수행 한 것처럼).

자식 노드 관리의 책임은 논리적으로 상위 노드에 배치 될 수 있습니다. 부모 노드는 정의 상 디렉토리 노드 일 수 있습니다. 따라서 디렉토리 노드 클래스 에는 직접 자식 노드 모음 인이 있습니다. 논리적으로는 이름에 대한 글로벌 맵이 존재하지 않으며, 루트 노드를 아는 것만으로 전체 파일 시스템에 액세스 할 수 있습니다. 은 루트 노드에서 시작하여 트리로 이동하여 해결할 수 있습니다.

"현재 디렉토리"의 개념은 단순히 상기 디렉토리 노드에 대한 참조를 유지함으로써 실현 될 수있다. 상대 pathes로 작업하는 작업은 현재 디렉토리 노드를 루트로 취급하기 만합니다.

어떤 시점에서 파일과 디렉토리를 구분해야합니다. Directory만이 아이들을 관리 할 것입니다. 이질적인 API 기능을 모델링하는 여러 가지 방법이 있습니다 (다시 복합 패턴을 살펴보십시오 : http://en.wikipedia.org/wiki/Composite_pattern).

관련 문제