2014-10-19 18 views
5

Ödevim, klasör nesneleri ve dosya nesneleri kullanarak bir dosya sistemi programlamak ve daha sonra aynı ağaçtaki iki nesneyi yönetmek için bir Dosya Sistemi nesnesini kullanmaktır. Benim sorunum, iki nesneyi nasıl aynı şekilde ele alacağımı anlayamıyorum.İki nesneyi bir ağaçta aynı şekilde işlemek için Java özeti

Ödev, "Dosya ve klasörün miras aldığı bir soyut sınıfa sahip olmanıza yardımcı olabilir, böylece bunları aynı şekilde ele alabilirsiniz." Ama hata yapmaya devam ediyorum.

import java.util.*; 

public class FileSys { 

    private Node firstFolder; 

    public void newFolder(String loc) { 
     if (firstFolder == null) { // If there are no folders 
      Node folder = new Folder(loc); 
      firstFolder = folder; 
     } 
     else { // If there are folders 

      String s = loc; 
      String[] folders = s.split("\\\\"); // Each file/folder name is put into an array 

      boolean found; // Flag if found 

      Node current = firstFolder; //Sets the first folder to the current 
      int n = 0; 

      while (folders.length - 1 > n) { // To find the folder being added to 

       int i = 0; 
       found = false; // Resets flag 

       while (current.size > i) { // To search through the names of the folders 

        if (current.next[i].name.equalsIgnoreCase(folders[n])) { 
         current = current.next[i]; 
         found = true; // Raises flag 
         break; 
        } 

        i++; 
       } 

       if (!found) // incomplete. Add Exception. 
        System.out.println("ERROR"); 

       n++; 
      } 

      Node folder = new Folder(folders[folders.length - 1]); 
      current.next[current.size] = folder; 
     } 
    } 

    abstract class Node { 
     String name; 

     Node(String name) { 
      this.name = name; 
     } 
    } 



    private class File extends Node { 
     String data; 

     File(String nm, String data) { 
      super(nm); 
      this.data = data; 
     } 
    } 


    private class Folder extends Node { 
     private static final int ARRAYSIZE = 20; // default array size 

     private int size = 0; 
     private Node[] next = new Node[ARRAYSIZE]; 

     public Folder(String nm) { 
      super(nm); 
      next[0] = null; 
     } 
    } 

// Main method omitted 
} 

Doğru yönde herhangi bir yardımı takdir ediyorum! Son derece basit bir hata gibi hissediyorum, ama neyin yanlış olduğunu bilmek için nesneler ve özetler konusunda yeterli tecrübem yok. Yayınlamayı denedim, ancak çalışma zamanı sırasında daha fazla hataya neden oldu. Teşekkür ederim!

Düzenleme: İşte

FileSys.java:55: error: cannot find symbol 
       while(current.size > i) 
          ^
    symbol: variable size 
    location: variable current of type FileSys.Node 
FileSys.java:57: error: cannot find symbol 
        if(current.next[i].name.equalsIgnoreCase(folders[n])) 
          ^
    symbol: variable next 
    location: variable current of type FileSys.Node 
FileSys.java:59: error: cannot find symbol 
         current = current.next[i]; 
             ^
    symbol: variable next 
    location: variable current of type FileSys.Node 
FileSys.java:76: error: cannot find symbol 
      current.next[current.size] = folder; 
       ^
    symbol: variable next 
    location: variable current of type FileSys.Node 
FileSys.java:76: error: cannot find symbol 
      current.next[current.size] = folder; 
           ^
    symbol: variable size 
    location: variable current of type FileSys.Node 
5 errors 
+0

Tam olarak sorun nedir? – immibis

+0

Ne tür hatalar alıyorsunuz? Sınıf kurulumunuz anlamlıdır. – ApproachingDarknessFish

+0

İki nesneyi nasıl ele aldığımı bilmiyorum. Soyut bir Node sınıfı yaptım ama ne zaman Node klasörünü kullanıyorum = new Folder(); Klasör nesnesinde bulunan verilerden herhangi birini veya bir sonraki boyutu kullanamıyorum. – Bleu

cevap

0

Eğer current.size ve current.next yapıyoruz. size ve next öğelerinin ikisi de Folder sınıfında private sınıfıdır. Bu, örnekleri kullanarak erişemeyeceğiniz anlamına gelir; bunlar, sınıfa private'dır ve sınıf tarafından dahili olarak kullanılmalıdır.

Yani, onları

public int getSize() { 
    //return size; 
} 

Hope gibi sınıf şey public erişim belirticisiyle tanımlanmış alıcılar kullanmak erişmek için, bu yardımcı olur.

1

Bir değişken bir sınıf olarak bildirildiğinde, onu yalnızca bu sınıf için tanımlanan yöntemlerle çağırabilirsiniz.

Node n = new Folder(); 
n.name; //Fine, all nodes have the name attribute 
n.next; //Not fine, nodes do not have a next attribute 

çözeltisi tipi döküm olup. Döküm türü, derleyiciye "Bu nesnenin çalışma zamanında bu türden olacağını biliyorum" demenin bir yoludur.

Folder f = (Folder) n; //We are telling the compiler that n is a Folder 
f.next; //Fine, because folders have the next attribute 

Son bir sorun var: Klasörler ve dosyalar arasında ayrım yapmamız gerekiyor. instanceof operatörünü kullanabiliriz.

if(n instanceof Folder){ 
    doFolderStuff(); 
}else if (n instanceof File){ 
    doFileStuff() 
} 
+0

Teşekkürler! Daha önce yanlış yerlerde tip dökümü kullanıyordum. Gerçekleştirdiğimde esas olarak "current = (Folder) current.children [i];" gibi işaretçiler kullanılırken buna ihtiyacım vardı. – Bleu

0

Bildiğim kadarıyla Organizasyonu sizi benzer bulmak nesne sözleşmeleri birleştirmek isteyebilirsiniz ilgili olarak: Bir dosyadan isteyebilirsiniz operasyonların çoğu sağlayacak parametrelerin farklı kombinasyonları ile

public interface FSFilter{ 
    public boolean accept(FSNode node); 
} 

public interface FSNode { 
    public String getPath(); 
    public FSNode getParent(): 
    public Volume getVolume(); 
    public boolean isFile(); 
    public boolean isFolder(); 
    public boolean isVolume(); 
    public boolean exists(); 
    public boolean delete(); 
    public List<FSNode> getSubNodes(boolean recursive, int depth, FSFilter filter); 
    public int deleteSubNodes(boolean recursive, int depth, FSFilter filter); 
    public long getSize(boolean recursive, int depth, FSFilter filter); 
} 

yukarıdaki yöntemler sistem ağacı. Belirli dosya sistemi nesnelerine özel işlevler eklemek için, her biri için uygulama sağlayabilirsiniz. Örneğin Volume sınıf fazladan diskUsage() yöntemine sahip olabilir ve File sınıf Sonra getInputStream() vb

public class File implements FSNode { //... implementation...//} 

public class Folder implements FSNode { //... implementation...//} 

public class Volume implements FSNode { //... implementation...//} 

olabilir, şöyle bir vatansız statik fonksiyonu olarak bunların tümünde geçerli olduğu tüm yarar mantığını yerleştirmek isteyebilir dosyaların tekrar listesi, silme, yaratma ve modifikasyonlar. Çünkü bu işlemler genellikle temel işletim sistemi çağrılarıyla ilgilenirdi. Bunlar, programınızda ls, rm, mount vb. OS komutlarının eşdeğerleri olacaktır. Yukarıdaki uygulamalar bu yardımcı fonksiyonları dahili olarak çağırıyor olabilir.Ayrıca, karmaşık dosya sistemi kodunun çoğu burada ikamet ediyorum:

public final class FSUtil{ 
    public static List<FSNode> list(boolean recursive, int depth, FSFilter filter){//... logic...//} 
    public static long byteSize(FSNode node, boolean recursive, depth, FSFilter filter){//... logic...//} 
    public static boolean delete(FSNode node,boolean recursive, FSFilter filter){//... logic...//} 
    ... and more ... 
} 

Referans olması için, apache.commons.io gibi mevcut uygulamalarda bakabilirsiniz.

İlgili konular