Készítsünk egy egyszerű virtuális fájlrendszer reprezentációt Javaban!
A fájlrendszer komponensei egyelőre csak fájlok és könyvtárak lehetnek.
Minden könyvtár rendelkezik egy szülőkönyvtárral (kivéve a gyökérkönyvtárat).
A megoldás ellenőrzéséhez a következő tesztfájl használandó:
Megjegyzések:
dumpExceptions
változó igazra állítása segíthet a hibák felderítésében.import
utasítások egyértelművé teszik a
csomagszerkezetet.Alább található három interfészdefiníció, ezekhez kell konkrét megvalósítást adni:
A megvalósítandó funkciók a következők:
IEntry
: minden fájlrendszer komponens őse (azaz a fájloknak is, és a
könyvtáraknak is). Az alábbi funkciókkal rendelkezik:
String getName()
: Megadja az adott komponens (fájl vagy könyvtár)
nevét.IFolder getParent()
: Megadja a tartalmazó könyvtár példányát
(gyökérkönyvtár esetén ez legyen null
).int size()
: Megadja az adott komponens méretét (fájlok esetén ez
legyen a tartalmazott szöveg mérete, egyébként 0).IFolder getRoot()
: Megadja a fájlrendszer gyökérkönyvtárát.IFile
: A fájloknak egyszerű szöveges tartalmuk van, amely lekérdezhető
a String getContent()
függvénnyel.IFolder
: Konténer, amely újabb fájlokat vagy könyvtárakat tartalmazhat.
A szolgáltatásai a következők:
boolean isEmptyFolder()
: Megadja, hogy az adott könyvtár üres-e
(azaz azt, hogy van-e benne másik könyvtár vagy fájl).boolean isRootFolder()
: Igaz, ha az adott könyvtár megegyezik a
gyökérkönyvtárral.Collection<IEntry> entries()
: Megadja a könyvtár által tartalmazott
komponenseket (tetszőleges adatszerkezettel megoldhatod).void add(IEntry entry)
: Könyvtárhoz új komponens hozzáadása.void remove(IEntry entry)
: Könyvtárból komponens törlése.boolean containsEntry(IEntry entry)
: Megadja, hogy a könyvtár
tartalmazza-e a megadott komponenst.Készítsd el tehát a fenti interfészeket megvalósító Entry
, File
és Folder
osztályokat! Mind a File
, mind a Folder
származzon az Entry
absztrakt
osztályból!
A konkrét megvalósításod, az Entry
osztály statikus adattagként tartalmazza
a gyökérkönyvtárat, amit a következőhöz hasonló módon lehessen létrehozni:
public static IFolder createRootFolder(final String name) {
final Folder root = new Folder( null, name );
Entry.root = root;
return root;
}
Az osztályok a következő konstruktorokkal rendelkezzenek:
public Folder(final IFolder parent, final String name)
, amely beállítja a
könyvtár szülőkönyvtárát, valamint az adott könyvtár nevét.public File(final IFolder parent, final String name, final String content)
,
amely beállítja a fájl szülőkönyvtárát, nevét, valamint megadja a tartalmát
is.Mindkét esetben adjuk hozzá a létrejövő osztály példányát (this
) a
szülőkönyvtárhoz az add()
függvényen keresztül!
Valósítsd meg a következő funkciókat, amelyeket az IEntry
interfész ír elő!
void delete()
: A komponens törlése.void moveTo(IFolder folder)
: A komponens áthelyezése a megadott könyvtárba.void rename(String newName)
: A komponens átnevezése.Valósítsd meg a következő, bejárásokkal kapcsolatos funkciókat!
IEntry
által definiált String getAbsolutePath()
függvény adja meg a
teljes elérési utat az adott komponenshez. A szeparátor karakter legyen a /
.filesystem.Utils
osztályt, amely az int totalSizeOf(IFolder root)
statikus függvénnyel képes meghatározni a megadott könyvtár teljes méretét
(azaz a benne lévő fájlok, valamint az alkönyvtáraiban lévő fájlok méretének
összegét).filesystem.Utils
osztályt, amely képes meghatározni egy adott
könyvtárban található fájlok közül a legkisebb és legnagyobb fájl méretét,
valamint megadja a fájlok rendezett listáját (ezeknek nem kell rekurzív
műveleteknek lenniük).